LOGO
Лекц № 11
Стекийг нэг холбоост жагсаалт
ашиглан нэвтрүүлэх
Хичээлийн агуулга
Стекийг динамикаар
тодорхойлох шаардлага
 Стекийг массиваар илэрхийлэх үед стекийн
хэмжээ нь тогтмол тодорхойлогддог тул хэмжээг
өөрчлөх боломжгүй юм.
 Стект хадгалах өгөгдлийн хэмжээг мэдэж байгаа
тохиолдолд стекийг массив ашиглан нэвтрүүлэх
нь тохиромжтой.
Стекийг динамикаар
тодорхойлох шаардлага
 Харин стект хадгалагдах өгөгдлийн хэмжээг
урьдчилан мэдэх боломжгүй тохиолдолд стекийг
динамикаар зохион байгуулах буюу жагсаалтаар
илэрхийлэх шаардлагатай болно.
 Ингэж стек өгөгдлийн бүтцийг динамикаар
зохион байгуулахад нэг холбоост жагсаалтыг
ашиглана.
Өгөгдөл
Стекийн зангилаа
 Стекийг нэг холбоост жагсаалтаар илэрхийлж
байгаа тул зангилаа нь өгөгдөл ба холбоос
гэсэн хоёр хэсгээс тогтоно.
45
45
class Node
{
Type element;
Node* link;
Node(const Type evalue, Node* lvalue){
element=evalue; link=lvalue;
}
friend class Stack;
};
Стекийг зангилааг
илэрхийлэх
Type element;
Node *link;
Стекийг зангилааг
илэрхийлэх
45
45
67
33
Node
Node
Node
 Стект дараах гадаад
заагчуудыг тодорхойлж,
ашиглах шаардлагатай
1. Оройн элемэнтийг заагч.
Энэ заагчийн
тусламжтайгаар стект
хийгдэх үйлдлүүдийг
гүйцэтгэнэ.
Стекийг зохион байгуулах
45
67
33
TOP
Стект элемэнт нэмэх– Push()
Стекээс элемэнт устгах– Pop()
Стек хоосон эсэхийг шалгах– IsEmpty()
Стекийг хоослох– MakeEmpty()
Стекийн оройн элемэнтийг буцаах– Last()
Стекийн хэмжээг буцаах – SizeOfStack()
Стекийн элемэнтүүдийг хэвлэх – Print()
Динамик стект
хийгдэх үйлдлүүд
class Stack{
Node *Top;
public:
Stack();
~Stack();
void Push(Type item );
void Pop(Type& item);
bool IsEmpty();
void MakeEmpty();
void SizeOfStack();
void TopOfStack();
void Print();
};
Стекийг нэг холбоост
жагсаалт ашиглан нэвтрүүлэх
Stack::Stack(){
Top=NULL;
}
Тайлбар:
Stack st;
// st нэртэй стек үүсгэж байна.
Динамик стекийг үүсгэх
байгуулагч функц:
TOP
Stack::~Stack(){
MakeEmpty();
}
void Stack::MakeEmpty(){
Node*curr;
while(Top!=NULL){
curr=Top;
Top=Top->link;
delete curr;
}
}
Динамик стекийг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
45
67
33
TOP
CURR
Stack::~Stack(){
MakeEmpty();
}
void Stack::MakeEmpty(){
Node*curr;
while(Top!=NULL){
curr=Top;
Top=Top->link;
delete curr;
}
}
Динамик стекийг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
67
33
TOP
CURR
Stack::~Stack(){
MakeEmpty();
}
void Stack::MakeEmpty(){
Node*curr;
while(Top!=NULL){
curr=Top;
Top=Top->link;
delete curr;
}
}
Динамик стекийг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
33
TOP
CURR
bool Stack::IsEmpty(){
if(Top!=NULL)
return false;
else
return true;
}
Стекийг хоосон
эсэхийг шалгах
TOP
45
67
33
TOP
true false
void Stack::Push(const Type item){
if(IsEmpty()){
Node*curr= new Node(item, NULL);
Top=curr;
}
else{
Node*curr= new Node(item, Top);
Top=curr;
}
}
Динамик стект
элемэнт нэмэх
Динамик стект
элемэнт нэмэх
TOP
45
67
33
TOP
33
CURR
CURR
void Stack::Pop(Type &item){
if(IsEmpty()){
cout<<"Stack hooson bna"<<endl;
}
else {
Node *curr=Top;
item=Top->element;
Top=Top->link;
delete curr;
}
}
Динамик стекээс
элемэнт авах буюу устгах
Динамик стекээс
элемэнт авах буюу устгах
TOP
45
67
33
TOP CURR
Stack
hooson
bna
item=45
void Stack::TopOfStack(){
if(IsEmpty())
cout<<"Stack hooson bna"<<endl;
else
cout<<"Stackiin oroin
element:"<<Top->element<<endl;
}
Динамик стекийн
оройн элемэнтийг буцаах
Динамик стекийн
оройн элемэнтийг буцаах
TOP
45
67
33
TOP
Stack
hooson
bna
Stackiin oroin
element:45
void Stack::SizeOfStack(){
if(IsEmpty())
cout<<"Stack elementgui bna"<<endl;
else {
Node*curr=Top;
int size=0;
while(curr!=NULL){
size=size+1;
curr=curr->link;
}
cout<<"hemjee"<<size<<endl;
}
}
Динамик стекийн
хэмжээг буцаах
Динамик стекийн
оройн элемэнтийг буцаах
TOP
45
67
33
TOP
Stack
elementgui
bna
size=0
CURR
size=1size=2
Динамик стекийн
оройн элемэнтийг буцаах
TOP
45
67
33
TOP
Stack
elementgui
bna
size=0
CURR
size=1size=2
Динамик стекийн
оройн элемэнтийг буцаах
TOP
45
67
33
TOP
Stack
elementgui
bna
size=0
CURR
size=1size=2size=3
Hemjee:3
void Stack::Print(){
if(IsEmpty())
cout<<"Stack hooson bna"<<endl;
else{
Node*curr=Top;
cout<<"Stackiin elementuud:"<<endl;
while(curr!=NULL){
cout<<curr->element<<endl;
curr=curr->link;
}
}
}
Динамик стекийн
элемэнтүүдийг хэвлэх
Динамик стекийн
элемэнтүүдийг хэвлэх
TOP
Stack
hooson bna
Динамик стекийн
элемэнтүүдийг хэвлэх
45
67
33
TOP
Stackiin elementuud:
CURR
45
Динамик стекийн
элемэнтүүдийг хэвлэх
45
67
33
TOP
Stackiin elementuud:
CURR
45 67
Динамик стекийн
элемэнтүүдийг хэвлэх
45
67
33
TOP
Stackiin elementuud:
CURR
45 67 33
Динамик стекийн
элемэнтүүдийг хэвлэх
45
67
33
TOP
Stackiin elementuud:
CURR
45 67 33
Стекийн хэрэглээ:
Арифметик илэрхийлэл бодох
 Арифметик илэрхийллийг бодохдоо үйлдлийн
тэмдэгүүдийн гүйцэтгэгдэх дарааллыг
баримтлах ёстой.
 Өөрөөр хэлбэл аливаа илэрхийллийг бодохдоо
өндөр зэрэглэл бүхий үйлдлээс эхлэн гүйцэтгэж,
үр дүнг нь санан дараачийн үйлдэлд ашиглах
замаар алхам алхамаар гүйцэтгэдэг.
Стекийн хэрэглээ:
Арифметик илэрхийлэл бодох
 Илэрхийлэлд олон янзын үйлдлүүд болон
давхар хаалтууд оролцохын хэрээр алхамын тоо
ихэсч, засварын утга нэмэгдэнэ.
 Ийм илэрхийллийг бодох програмын алгоритмыг
зохиох хялбар биш байдаг.
 Харин ийм илэрхийллийг хялбар бодох польш
тэмдэглээ гэсэн арга байдаг.
Польш тэмдэглэгээ
 Бид арифметик илэрхийллийг бичихдээ
үйлдлийн тэмдэгийг үйлдэлд оролцох
операндуудын дунд бичдэг. Илэрхийллийн йим
бичиглэлийг инфикс бичиглэл гэж нэрлэдэг.
 Харин Польшийн нэгэн математикч арифметик
илэрхийлэл дэх үйлдлийн тэмдэгийг хоёр
операндынх нь ард /постфикс бичиглэл/ эсвэл
өмнө /префикс бичиглэл/ бичиж болох
хэлбэрийг олж харсан. Иймээс ийм бичиглэлийг
польш тэмдэглэгээ гэж нэрлэдэг.
Польш тэмдэглэгээ
 Илэрхийллийн польш тэмдэглэгээнд хаалт
ашигладаггүй бөгөөд үйлдлийн тэмдэгийн
байрлалаар гүйцэтгэгдэх дараалал нь
тодорхойлогддог.
 Префикс болон постфикс бичиглэл бүхий
илэрхийллийн засврын утгуудыг стект хадгалан,
илэрхийллийг зөвхөн нэг удаа уншин хялбар
аргаар бодож болно.
Арифметик илэрхийллийг бодох
 Арифметик илэрхийллийг хялбар аргаар бодох
алгоритм нь дараах хоёр алхамаас тогтоно:
 Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх
 Илэрхийллийг бодох
 Аль ч алхамд стек үндсэн үүрэг гүйцэтгэнэ.

Илэрхийллийг польш
тэмдэглэгээнд хөрвүүлэх
 Өгөгдсөн илэрхийлэл Q нь ердийн буюу префикс
бичиглэл илэрхийлэл байна.
 Уг илэрхийлэл нь операнд, оператороос гадна
хаалт агуулж болно.
 Операторуудын гүйцэтгэгдэх дараалал нь:
1. Зэрэг дэвшүүлэх
2. Үржих ба хуваах
3. Нэмэх ба хасах
 Ижил зэрэглэл бүхий үйлдлүүд нь илэрхийлэлд
орсон дарааллаараа гүйцэтгэгдэнэ.
Илэрхийллийг польш
тэмдэглэгээнд хөрвүүлэх
 Дараах алгоритмаар Q арифметик илэрхийллээс
польш тэмдэглэгээнд хөрвөсөн Р илэрхийллийг
гаргаж авна.
 Энэ алгоритм нь хаалт болон операторуудыг түр
хадгалах стек ашиглана.
 Илэрхийллийг хөрвүүлж дууссаны дараа стек
хоосон болно.
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
1. Q илэрхийллийг эхлэлээс нь төгсгөл хүртэл
элемэнт бүрээр стек хоосон болтол уншихдаа
дараах 2-5 алхамуудыг давтан гүйцэтгэнэ.
2. Хэрэв уншигдсан элемэнт нь операнд бол Р
илэрхийллийн төгсгөлд нэмнэ
3. Хэрэв уншигдсан элемэнт нь нээх хаалт бол
стект хийнэ.
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
4. Хэрэв уншигдсан элемэнт нь оператор бол
a. Уг уншигдсан оператортой ижил болон их
зэрэглэлтэй бүх операторуудыг стекийн
оройгоос авч P илэрхийлэлд нэмнэ
b. Уг уншигдсан операторыг стект нэмнэ
5. Хэрэв уншигдсан элемэнт нь хаах хаалт бол
a. Нээх хаалт тааралдтал стекийн оройгоос
операторуудыг авч P илэрхийлэлд нэмнэ
b. Нээх хаалтыг стекээс гаргана.
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Дээрхи инфикс бичиглэл бүхий
илэрхийллийг постфикс
бичиглэлрүү хөрвүүлэх процесс
нь дараах байдлаар
тодорхойлогдоно.
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Илэрхийллийг польш тэмдэглэгээнд
хөрвүүлэх алгоритмын зарчим
Q=
Инфикс илэрхийлэл
Постфикс илэрхийлэл
Стек
P=
Q=
P=
Польш тэмдэглэгээнд хөрвөсөн
илэрхийллийг бодох
 Р илэрхийллийг польш тэмдэглэгээнд хөрвөсөн
илэрхийлэл гэж үзвэл илэрхийллийг бодохдоо дараах
алхамуудыг гүйцэтгэнэ.
1. Р илэрхийллийг эхлэлээс төгсгөл хүртэл уншихдаа 2
ба 3-р алхамуудыг гүйцэтгэнэ.
2. Хэрэв операнд бол стект хийнэ.
3. Хэрэв оператор бол стекийн оройгоос 2 элемэнт
авч, тэдгээрт уг операторын үйлдлийг гүйцэтгэн үр
дүнг стект хийнэ.
4. Р илэрхийллийн төгсгөлд хүрснээр бодолт дуусах
бөгөөд стек дэх элемэнт нь Р илэрхийллийн эцсийн
хариу болно. Энэ үед стект гахц элемэнт байх
болно.

Өгөгдлийн бүтэц 11