Dsi lec103. Стек /Stack/
Жагсаалтын бүтцүүдийн хувьд элемэнтийг
нэмэх, устгах гэх мэтийн элемэнтэд хандах
үйлдэл нь дурын байрлалд гүйцэтгэгдэж байсан.
Тэгвэл зарим өгөгдлийн бүтцийн хувьд
элемэнтэд хандах үйлдэл нь хязгаарлагдмал
байдаг.
Ийм хязгаарлагдмал хандалт бүхий өгөгдлийн
бүтцийн нэг бол стек юм.
Багш: В.Нямсүрэн
4. Стек
Элемэнтийг устгах ба нэмэх үйлдэл нь орой гэж
нэрлэгдэх нэг талаасаа хийгддэг шугаман
тогтцыг стек гэнэ.
Үүнийг LIFO төрөл гэж ч нэрлэдэг. Энэ нь Last In
First Out буюу сүүлд орсон нь эхэлж гарна гэсэн
үг юм.
Хэдийгээр стек нь маш хязгаарлагдмал
үйлдэлтэй боловч компьютерийн програмчлалд
чухал үүрэгтэй өгөгдлийн бүтцүүдийн нэг юм.
Багш: В.Нямсүрэн
5. Амьдрал дээрх стекийн жишээ:
Хоолны Гутлын
тавиуруудын хайрцагнуудын
стек стек
Зооснуудын
Цэвэрхэн
стек
эвхсэн
цамцнуудын
стек
Багш: В.Нямсүрэн
6. Стекийг нэвтрүүлэх аргууд
Стекийг програмд олон ялгаатай аргаар нэвтрүүлж
боловч ихэвчлэн
• Шугаман массив
• Нэг холбоост ашигладаг.
Шугаман массив ашиглан нэвтрүүлсэн стек нь
компляцийн үед статикаар тодорхойлогдох
өгөөд статик стекийн нийт хэмжээ нь тогтмол
байдаг
Нэг ашиглан нэвтрүүлсэн стек нь програм
ажиллах явцад динамикаар тодорхойлогдох
бөгөөд динамик стекийн хэмжээ нь өөрчлөгдөж
байдаг.
Багш: В.Нямсүрэн
7. Стекийн массиваар
илэрхийлэх хийсвэрлэлт
өгөгдөл:
Стекийн
• Стекийн өгөгдөл / *stack /
• Стекийн хэмжээ / MaxSize /
• Cтекийн орой / top /
• Стект элемэнт нэмэх /push/
Стекийн
үйлдэл:
• Стекээс элемэнтийг авах /pop/
• Стек хоосон эсэхийг шалгах /isempty/
• Стек дүүрсэн эсэхийг шалгах /isfull/
• Стекийг элемэнтүүдийг харах /view/
Багш: В.Нямсүрэн
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 гэсэн нэртэй стекийг үүсгэж байна.
Багш: В.Нямсүрэн
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
буцаана.
Багш: В.Нямсүрэн
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
Багш: В.Нямсүрэн
28. Cтекийн хэрэглээ
Илэрхийллийн хаалтны баланс шалгах
алгоритм
Алгоритмын зорилго нь: тэмдэгтүүдийн
дараалалд (),{},[] гэсэн хаалтууд оролцох
бөгөөд нээх (,{,[ бүрт харгалзан хаах хаалт
),},] байгаа эсэхийг шалгах юм.
Багш: В.Нямсүрэн
29. Cтекийн хэрэглээ
Баланслагдсан буюу зөв хаагдсан
хаалтуудын цуваа
•()
•{}{}
•({[]()}[])
Баланслаагүй буюу буруу хаагдсан
хаалтуудын цуваа
•)
•[
•{[}]
Багш: В.Нямсүрэн
30. Cтекийн хэрэглээ
Энэ асуудлыг үийдэ хамгийн хялбар ухаалаг зам
нь стек ашиглах юм.
Алгоритмын хэрэгжүүлэлт нь: Тэмдэгтүүдийн
цувааны эхлэлээс тэмдэгт бүрийг уншин, нээх
хаалт таарах бүрт түүнийг стект хийх ба хаах
хаалт тааралдвал стекээс нэг элемэнт авч
харгалзах нээх хаалт мөн эсэхийг шалган, зөв
тохиолдолд цааш үргэлжлүүлэн шалгана.
Багш: В.Нямсүрэн
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++;
}
Багш: В.Нямсүрэн