SlideShare a Scribd company logo
Стек, түүнийг массив
ашиглан зохион байгуулах
         Лекц №10
                    LOGO
Хичээлийн агуулга




Багш: В.Нямсүрэн
Стек /Stack/
 Жагсаалтын бүтцүүдийн хувьд элемэнтийг
  нэмэх, устгах гэх мэтийн элемэнтэд хандах
  үйлдэл нь дурын байрлалд гүйцэтгэгдэж байсан.

 Тэгвэл  зарим   өгөгдлийн бүтцийн   хувьд
  элемэнтэд хандах үйлдэл нь хязгаарлагдмал
  байдаг.

 Ийм хязгаарлагдмал хандалт бүхий өгөгдлийн
  бүтцийн нэг бол стек юм.


Багш: В.Нямсүрэн
Стек
 Элемэнтийг устгах ба нэмэх үйлдэл нь орой гэж
  нэрлэгдэх нэг талаасаа хийгддэг шугаман
  тогтцыг стек гэнэ.

 Үүнийг LIFO төрөл гэж ч нэрлэдэг. Энэ нь Last In
  First Out буюу сүүлд орсон нь эхэлж гарна гэсэн
  үг юм.

 Хэдийгээр стек нь маш хязгаарлагдмал
  үйлдэлтэй боловч компьютерийн програмчлалд
  чухал үүрэгтэй өгөгдлийн бүтцүүдийн нэг юм.

Багш: В.Нямсүрэн
Амьдрал дээрх стекийн жишээ:


   Хоолны                           Гутлын
 тавиуруудын                    хайрцагнуудын
     стек                            стек




                   Зооснуудын
                                                 Цэвэрхэн
                      стек
                                                  эвхсэн
                                                цамцнуудын
                                                   стек


Багш: В.Нямсүрэн
Стекийг нэвтрүүлэх аргууд
Стекийг програмд олон ялгаатай аргаар нэвтрүүлж
боловч ихэвчлэн
        • Шугаман массив
        • Нэг холбоост ашигладаг.
 Шугаман массив ашиглан нэвтрүүлсэн стек нь
  компляцийн үед статикаар тодорхойлогдох
  өгөөд статик стекийн нийт хэмжээ нь тогтмол
  байдаг
 Нэг ашиглан нэвтрүүлсэн стек нь програм
  ажиллах явцад динамикаар тодорхойлогдох
  бөгөөд динамик стекийн хэмжээ нь өөрчлөгдөж
  байдаг.
Багш: В.Нямсүрэн
Стекийн массиваар
илэрхийлэх хийсвэрлэлт
өгөгдөл:
Стекийн


            • Стекийн өгөгдөл      / *stack /
            • Стекийн хэмжээ       / MaxSize /
            • Cтекийн орой         / top /



            •   Стект элемэнт нэмэх              /push/
Стекийн
үйлдэл:




            •   Стекээс элемэнтийг авах          /pop/
            •   Стек хоосон эсэхийг шалгах       /isempty/
            •   Стек дүүрсэн эсэхийг шалгах      /isfull/
            •   Стекийг элемэнтүүдийг харах       /view/

Багш: В.Нямсүрэн
Стекийг массиваар
илэрхийлэх хийсвэрлэлт


Массив
                                   Оройн индекс
                           Стекийн орой




                    Стек




Багш: В.Нямсүрэн
Cтекийг массиваар илэрхийлэх
хийсвэр төрлийг тодорхойлох
class Stack{
    int top,MaxSize;
    Type*stItems;
public:
    Stack(int Msize);
    ~Stack();
    bool push(Type item);
    bool pop(Type &item);
    bool isempty();
    bool isfull();
    void view();
};

Багш: В.Нямсүрэн
Cтекийг үүсгэх
байгуулагч функц:
 Stack::Stack(int Msize){
      MaxSize=Msize;
      stItems=new Type[MaxSize];
      top=-1;
 }
 Тайлбар:
 Stack st(10);
 10 хэмжээтэй st гэсэн нэртэй стекийг үүсгэж байна.




Багш: В.Нямсүрэн
Cтекийг үүсгэх
байгуулагч функц:
   MaxSize         10
   stItems

         top       -1   0
                        1
                        2
                        3
                        4
                        5
                        6
                        7
                        8
                        9



Багш: В.Нямсүрэн
Стекийг санах ойгоос
чөлөөлөх устгагч функц:

  Stack::~Stack(){
      delete[] stItems;
  }




Багш: В.Нямсүрэн
Стекийг санах ойгоос
чөлөөлөх устгагч функц:
   MaxSize         10
   stItems

         top       -1     0
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9



Багш: В.Нямсүрэн
Стекийг хоосон
эсэхийг шалгах
 bool Stack::isempty(){
     if(top<0)
          return true;
     else
          return false;
 }




Багш: В.Нямсүрэн
Стекийг хоосон
эсэхийг шалгах
   MaxSize         10
   stItems

         top       -1   0
                        1
                        2
                        3

    Top      хувьсагч   4
                        5
    буюу оройн утга     6
    0-ээс бага тул      7
    стек      хоосон    8
    буюу true утга      9
    буцаана.
Багш: В.Нямсүрэн
Стекийг хоосон
эсэхийг шалгах
   MaxSize         10
   stItems

         top       2    0   A
                        1   Z
                        2   K
                        3

    Top      хувьсагч   4
                        5
    буюу оройн утга     6
    0-ээс их тул стек   7
    хоосон биш буюу     8
    false        утга   9
    буцаана.
Багш: В.Нямсүрэн
Стекийг дүүрэн
эсэхийг шалгах
  bool Stack::isfull(){
      if(top>=MaxSize-1)
           return true;
      else
           return false;
  }




Багш: В.Нямсүрэн
Стекийг дүүрэн
эсэхийг шалгах
   MaxSize         10
   stItems

         top       2    0   A
                        1   Z
                        2   K
    Top      хувьсагч   3
    буюу оройн утга     4
    MaxSize-1-ээс       5
    бага тул стек       6

    дүүрэн биш буюу     7
                        8
    false        утга
                        9
    буцаана.

Багш: В.Нямсүрэн
Стекийг дүүрэн
эсэхийг шалгах
   MaxSize         10
   stItems

         top       9    0   A
                        1   Z
                        2   K
    Top      хувьсагч   3   C
    буюу оройн утга     4   H
    MaxSize-1-тэй       5   L
    тэнцүү тул стек     6   Y
                            O
    дүүрэн      буюу    7
                        8   N
    true         утга
                        9   W
    буцаана.

Багш: В.Нямсүрэн
Стект элемэнт нэмэх
  bool Stack::push(Type item){
      if(isfull()){
           cout<<"Stack duuren"<<endl;
           return false;
      }
      else{
           stItems[++top]=item;
           return true;
      }
  }



Багш: В.Нямсүрэн
Стект элемэнт нэмэх
Тайлбар:
1. Стек дүүрэн эсэхийг шалгана.
   A. Хэрвээ стек дүүрэн бол Stack duuren
   мэдээллийг хэвлээд, стект элемэнт нэмж
   чадаагүй буюу false утга буцаана.
   B. Хэрвээ стек дүүрэн биш бол стекийн оройн
   утгыг нэгээр нэмэгдүүлэн, оройд элемэнтийг
   нэмээд, стект элемэнт нэмж чадсан буюу true
   утга буцаана.




Багш: В.Нямсүрэн
Стект элемэнт нэмэх

   MaxSize           10
   stItems

         top       2+1=3
                   2       0   A
                           1   Z
                           2   K
    St.push(‘E’);          3   E
                           4
                           5
                           6
                           7
                           8
                           9



Багш: В.Нямсүрэн
Стекээс элемэнтийг авах
  bool Stack::pop(Type &item){
      if(isempty()){
           cout<<"Stack hooson"<<endl;
           return false;
      }
      else{
           item=stItems[top--];
           return true;
      }
  }



Багш: В.Нямсүрэн
Стекээс элемэнтийг авах
Тайлбар:
1. Стек хоосон эсэхийг шалгана.
   A. Хэрвээ стек дүүрэн бол Stack hooson
   мэдээллийг хэвлээд, стекээс элемэнт устгаж
   чадаагүй буюу false утга буцаана.
   B. Хэрвээ стек хоосон биш бол стекийн оройн
   элемэнтийг    аван,   оройн    утгыг  нэгээр
   хоргодуулаад, стекийн оройн элемэнтийг авч
   чадсан буюу true утга буцаана.

    Оройн элемэнтийг авахдаа санах ойн үүрний
    хаягаар авна.

Багш: В.Нямсүрэн
Стекээс элемэнтийг авах

   MaxSize           10
   stItems

         top       3-1=2
                   3       0   A
                           1   Z
                           2   K
    St.pop(ch);            3   E
                           4
     Оройн                 5
     элемэнтийг аван,      6
     ch    хувьсагчийн     7
     утга E болно.         8
                           9



Багш: В.Нямсүрэн
Стекийн элемэнтүүдийг харах
  void Stack::view(){
  for(int i=0; i<=Top; i++)
      cout<<stItems[i];
  }




Багш: В.Нямсүрэн
Стекээс элемэнтийг авах

   MaxSize         10
   stItems

         top       3      0   A
                          1   Z
                          2   K
    St.view();            3   E
                          4
                          5
                          6
                          7
                          8
                          9



Багш: В.Нямсүрэн
Cтекийн хэрэглээ
    Илэрхийллийн хаалтны баланс шалгах
                   алгоритм
Алгоритмын      зорилго    нь:  тэмдэгтүүдийн
дараалалд (),{},[] гэсэн хаалтууд оролцох
бөгөөд нээх (,{,[ бүрт харгалзан хаах хаалт
),},] байгаа эсэхийг шалгах юм.




Багш: В.Нямсүрэн
Cтекийн хэрэглээ

 Баланслагдсан буюу зөв хаагдсан
 хаалтуудын цуваа
  •()
  •{}{}
  •({[]()}[])

 Баланслаагүй буюу буруу хаагдсан
 хаалтуудын цуваа
  •)
  •[
  •{[}]

Багш: В.Нямсүрэн
Cтекийн хэрэглээ
 Энэ асуудлыг үийдэ хамгийн хялбар ухаалаг зам
  нь стек ашиглах юм.

 Алгоритмын хэрэгжүүлэлт нь: Тэмдэгтүүдийн
  цувааны эхлэлээс тэмдэгт бүрийг уншин, нээх
  хаалт таарах бүрт түүнийг стект хийх ба хаах
  хаалт тааралдвал стекээс нэг элемэнт авч
  харгалзах нээх хаалт мөн эсэхийг шалган, зөв
  тохиолдолд цааш үргэлжлүүлэн шалгана.




Багш: В.Нямсүрэн
Cтекийн хэрэглээ
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
Typedef char Type;
enum bool {false,true};
class Stack{. . .};
char match(char cp){
  switch(cp){
    case')':return'(';
    case'}':return'{';
    case']':return'[';
  }
}
Багш: В.Нямсүрэн
Cтекийн хэрэглээ
void main(){
Stack st(100);
char s[80],ch;
int i=0;
cout<<"ilerhiilelee oruul;"; cin>>s;
while (s[i]){
  if (strchr("{[(",s[i])) st.push(s[i]);
  if (strchr("}])", s[i])){
  if((!st.pop(ch))||(ch=!match(s[i]))){
    cout<<"balancelaagui"<<endl;
    exit(-1);
  }
}
i++;
}
Багш: В.Нямсүрэн
Cтекийн хэрэглээ
if (st.isempty())
cout<<"balancelasan"<<endl;
else cout<<"balancelaagui"<<endl;
}




Багш: В.Нямсүрэн

More Related Content

PPTX
Dsi lec12
PPTX
Dsi lec11
PPTX
Dsi lec13
PPTX
Dsi lec8-copy
PPTX
Dsi lec9-copy
PPTX
Dsi lec6,7
DOCX
тоон дараалл хязгаар лекц№1
DOCX
2012 09 10 тоон дараалл хязгаар лекц№2
Dsi lec12
Dsi lec11
Dsi lec13
Dsi lec8-copy
Dsi lec9-copy
Dsi lec6,7
тоон дараалл хязгаар лекц№1
2012 09 10 тоон дараалл хязгаар лекц№2

Viewers also liked (20)

PPTX
Dsi lec5
PPTX
Dsi lec14
PPTX
Dsi lec1
PPTX
Dsi lec3
PPTX
Dsi lec2
PPTX
Dsi lec4
PPTX
Лекц 5
PPTX
Datastructure algoritm
PPTX
GNSS гэж юу вэ?
DOCX
ODP
Sodko111
PDF
Lec4 хereglegchiinpunkts
PPTX
Өгөгдлийн бүтэц
PPTX
Xml өгөгдлийн бүтэц
PPTX
Процессорын архитектур
PPTX
Lecture 5
PPT
User account policy
PPTX
Лекц 1
PPTX
Лекц 2
PPTX
Lecture 3
Dsi lec5
Dsi lec14
Dsi lec1
Dsi lec3
Dsi lec2
Dsi lec4
Лекц 5
Datastructure algoritm
GNSS гэж юу вэ?
Sodko111
Lec4 хereglegchiinpunkts
Өгөгдлийн бүтэц
Xml өгөгдлийн бүтэц
Процессорын архитектур
Lecture 5
User account policy
Лекц 1
Лекц 2
Lecture 3
Ad

Dsi lec10

  • 1. Стек, түүнийг массив ашиглан зохион байгуулах Лекц №10 LOGO
  • 3. Стек /Stack/  Жагсаалтын бүтцүүдийн хувьд элемэнтийг нэмэх, устгах гэх мэтийн элемэнтэд хандах үйлдэл нь дурын байрлалд гүйцэтгэгдэж байсан.  Тэгвэл зарим өгөгдлийн бүтцийн хувьд элемэнтэд хандах үйлдэл нь хязгаарлагдмал байдаг.  Ийм хязгаарлагдмал хандалт бүхий өгөгдлийн бүтцийн нэг бол стек юм. Багш: В.Нямсүрэн
  • 4. Стек  Элемэнтийг устгах ба нэмэх үйлдэл нь орой гэж нэрлэгдэх нэг талаасаа хийгддэг шугаман тогтцыг стек гэнэ.  Үүнийг LIFO төрөл гэж ч нэрлэдэг. Энэ нь Last In First Out буюу сүүлд орсон нь эхэлж гарна гэсэн үг юм.  Хэдийгээр стек нь маш хязгаарлагдмал үйлдэлтэй боловч компьютерийн програмчлалд чухал үүрэгтэй өгөгдлийн бүтцүүдийн нэг юм. Багш: В.Нямсүрэн
  • 5. Амьдрал дээрх стекийн жишээ: Хоолны Гутлын тавиуруудын хайрцагнуудын стек стек Зооснуудын Цэвэрхэн стек эвхсэн цамцнуудын стек Багш: В.Нямсүрэн
  • 6. Стекийг нэвтрүүлэх аргууд Стекийг програмд олон ялгаатай аргаар нэвтрүүлж боловч ихэвчлэн • Шугаман массив • Нэг холбоост ашигладаг.  Шугаман массив ашиглан нэвтрүүлсэн стек нь компляцийн үед статикаар тодорхойлогдох өгөөд статик стекийн нийт хэмжээ нь тогтмол байдаг  Нэг ашиглан нэвтрүүлсэн стек нь програм ажиллах явцад динамикаар тодорхойлогдох бөгөөд динамик стекийн хэмжээ нь өөрчлөгдөж байдаг. Багш: В.Нямсүрэн
  • 7. Стекийн массиваар илэрхийлэх хийсвэрлэлт өгөгдөл: Стекийн • Стекийн өгөгдөл / *stack / • Стекийн хэмжээ / MaxSize / • Cтекийн орой / top / • Стект элемэнт нэмэх /push/ Стекийн үйлдэл: • Стекээс элемэнтийг авах /pop/ • Стек хоосон эсэхийг шалгах /isempty/ • Стек дүүрсэн эсэхийг шалгах /isfull/ • Стекийг элемэнтүүдийг харах /view/ Багш: В.Нямсүрэн
  • 8. Стекийг массиваар илэрхийлэх хийсвэрлэлт Массив Оройн индекс Стекийн орой Стек Багш: В.Нямсүрэн
  • 9. Cтекийг массиваар илэрхийлэх хийсвэр төрлийг тодорхойлох class Stack{ int top,MaxSize; Type*stItems; public: Stack(int Msize); ~Stack(); bool push(Type item); bool pop(Type &item); bool isempty(); bool isfull(); void view(); }; Багш: В.Нямсүрэн
  • 10. Cтекийг үүсгэх байгуулагч функц: Stack::Stack(int Msize){ MaxSize=Msize; stItems=new Type[MaxSize]; top=-1; } Тайлбар: Stack st(10); 10 хэмжээтэй st гэсэн нэртэй стекийг үүсгэж байна. Багш: В.Нямсүрэн
  • 11. Cтекийг үүсгэх байгуулагч функц: MaxSize 10 stItems top -1 0 1 2 3 4 5 6 7 8 9 Багш: В.Нямсүрэн
  • 12. Стекийг санах ойгоос чөлөөлөх устгагч функц: Stack::~Stack(){ delete[] stItems; } Багш: В.Нямсүрэн
  • 13. Стекийг санах ойгоос чөлөөлөх устгагч функц: MaxSize 10 stItems top -1 0 1 2 3 4 5 6 7 8 9 Багш: В.Нямсүрэн
  • 14. Стекийг хоосон эсэхийг шалгах bool Stack::isempty(){ if(top<0) return true; else return false; } Багш: В.Нямсүрэн
  • 15. Стекийг хоосон эсэхийг шалгах MaxSize 10 stItems top -1 0 1 2 3 Top хувьсагч 4 5 буюу оройн утга 6 0-ээс бага тул 7 стек хоосон 8 буюу true утга 9 буцаана. Багш: В.Нямсүрэн
  • 16. Стекийг хоосон эсэхийг шалгах MaxSize 10 stItems top 2 0 A 1 Z 2 K 3 Top хувьсагч 4 5 буюу оройн утга 6 0-ээс их тул стек 7 хоосон биш буюу 8 false утга 9 буцаана. Багш: В.Нямсүрэн
  • 17. Стекийг дүүрэн эсэхийг шалгах bool Stack::isfull(){ if(top>=MaxSize-1) return true; else return false; } Багш: В.Нямсүрэн
  • 18. Стекийг дүүрэн эсэхийг шалгах MaxSize 10 stItems top 2 0 A 1 Z 2 K Top хувьсагч 3 буюу оройн утга 4 MaxSize-1-ээс 5 бага тул стек 6 дүүрэн биш буюу 7 8 false утга 9 буцаана. Багш: В.Нямсүрэн
  • 19. Стекийг дүүрэн эсэхийг шалгах MaxSize 10 stItems top 9 0 A 1 Z 2 K Top хувьсагч 3 C буюу оройн утга 4 H MaxSize-1-тэй 5 L тэнцүү тул стек 6 Y O дүүрэн буюу 7 8 N true утга 9 W буцаана. Багш: В.Нямсүрэн
  • 20. Стект элемэнт нэмэх bool Stack::push(Type item){ if(isfull()){ cout<<"Stack duuren"<<endl; return false; } else{ stItems[++top]=item; return true; } } Багш: В.Нямсүрэн
  • 21. Стект элемэнт нэмэх Тайлбар: 1. Стек дүүрэн эсэхийг шалгана. A. Хэрвээ стек дүүрэн бол Stack duuren мэдээллийг хэвлээд, стект элемэнт нэмж чадаагүй буюу false утга буцаана. B. Хэрвээ стек дүүрэн биш бол стекийн оройн утгыг нэгээр нэмэгдүүлэн, оройд элемэнтийг нэмээд, стект элемэнт нэмж чадсан буюу true утга буцаана. Багш: В.Нямсүрэн
  • 22. Стект элемэнт нэмэх MaxSize 10 stItems top 2+1=3 2 0 A 1 Z 2 K St.push(‘E’); 3 E 4 5 6 7 8 9 Багш: В.Нямсүрэн
  • 23. Стекээс элемэнтийг авах bool Stack::pop(Type &item){ if(isempty()){ cout<<"Stack hooson"<<endl; return false; } else{ item=stItems[top--]; return true; } } Багш: В.Нямсүрэн
  • 24. Стекээс элемэнтийг авах Тайлбар: 1. Стек хоосон эсэхийг шалгана. A. Хэрвээ стек дүүрэн бол Stack hooson мэдээллийг хэвлээд, стекээс элемэнт устгаж чадаагүй буюу false утга буцаана. B. Хэрвээ стек хоосон биш бол стекийн оройн элемэнтийг аван, оройн утгыг нэгээр хоргодуулаад, стекийн оройн элемэнтийг авч чадсан буюу true утга буцаана. Оройн элемэнтийг авахдаа санах ойн үүрний хаягаар авна. Багш: В.Нямсүрэн
  • 25. Стекээс элемэнтийг авах MaxSize 10 stItems top 3-1=2 3 0 A 1 Z 2 K St.pop(ch); 3 E 4 Оройн 5 элемэнтийг аван, 6 ch хувьсагчийн 7 утга E болно. 8 9 Багш: В.Нямсүрэн
  • 26. Стекийн элемэнтүүдийг харах void Stack::view(){ for(int i=0; i<=Top; i++) cout<<stItems[i]; } Багш: В.Нямсүрэн
  • 27. Стекээс элемэнтийг авах MaxSize 10 stItems top 3 0 A 1 Z 2 K St.view(); 3 E 4 5 6 7 8 9 Багш: В.Нямсүрэн
  • 28. Cтекийн хэрэглээ Илэрхийллийн хаалтны баланс шалгах алгоритм Алгоритмын зорилго нь: тэмдэгтүүдийн дараалалд (),{},[] гэсэн хаалтууд оролцох бөгөөд нээх (,{,[ бүрт харгалзан хаах хаалт ),},] байгаа эсэхийг шалгах юм. Багш: В.Нямсүрэн
  • 29. Cтекийн хэрэглээ Баланслагдсан буюу зөв хаагдсан хаалтуудын цуваа •() •{}{} •({[]()}[]) Баланслаагүй буюу буруу хаагдсан хаалтуудын цуваа •) •[ •{[}] Багш: В.Нямсүрэн
  • 30. Cтекийн хэрэглээ  Энэ асуудлыг үийдэ хамгийн хялбар ухаалаг зам нь стек ашиглах юм.  Алгоритмын хэрэгжүүлэлт нь: Тэмдэгтүүдийн цувааны эхлэлээс тэмдэгт бүрийг уншин, нээх хаалт таарах бүрт түүнийг стект хийх ба хаах хаалт тааралдвал стекээс нэг элемэнт авч харгалзах нээх хаалт мөн эсэхийг шалган, зөв тохиолдолд цааш үргэлжлүүлэн шалгана. Багш: В.Нямсүрэн
  • 31. Cтекийн хэрэглээ #include<iostream.h> #include<string.h> #include<stdlib.h> #include<stdio.h> Typedef char Type; enum bool {false,true}; class Stack{. . .}; char match(char cp){ switch(cp){ case')':return'('; case'}':return'{'; case']':return'['; } } Багш: В.Нямсүрэн
  • 32. Cтекийн хэрэглээ void main(){ Stack st(100); char s[80],ch; int i=0; cout<<"ilerhiilelee oruul;"; cin>>s; while (s[i]){ if (strchr("{[(",s[i])) st.push(s[i]); if (strchr("}])", s[i])){ if((!st.pop(ch))||(ch=!match(s[i]))){ cout<<"balancelaagui"<<endl; exit(-1); } } i++; } Багш: В.Нямсүрэн
  • 33. Cтекийн хэрэглээ if (st.isempty()) cout<<"balancelasan"<<endl; else cout<<"balancelaagui"<<endl; } Багш: В.Нямсүрэн