Campus Life · Rumus - Rumus · Sainstek
Original PostPengertian dan Contoh dari Stack & Queue (Beserta Program dalam C++) (+ Video Materi)

#define MaxS n TypeData Isi(MaxS); TypeData Top;
#define MaxS n
struct Stack
{
TypeData Isi(MaxS);
TypeData Top;
};
void INITS (Stack &S)
{
S.Top = 0;
}
void PUSH(Stack &S, char Data) {if(S.Top < MaxS) {S.Top++;S.Isi[S.Top] = Data;}elsecout<<"Stack Penuh ......";}
void POP(Stack &S, char &Hsl) {if(S.Top != 0) {Hsl = S.Isi[Top];S.Top--;}elsecout<<"Stack Kosong ......";}
void CETAK(Stack S){int i;cout<<endl<<"Isi Stack : ";if (S.Top != 0){for(i=0;i<=S.Top;i++)cout<<S.Isi[i];}elsecout<<"Stack Kosong ......";}
int FULL(void){if(S.Top == MaxS) return(true);else return(false);}
int Empty(void){If(S.Top == 0) return(true);else return(false);}
int Clear(void){S.Top = 0;}
- Elemen Stack yaitu item-item data yang terdapat dalam Stack.
- Top menunjukkan posisi puncak pada Stack.
- Max menunjukkan banyaknya maksimum item dari Stack.
- Stack Kosong tidak mungkin dilakukan POP karena akan menyebabkan Error
- Stack Penuh tidak mungkin dilakukan PUSH karena akan menyebabkan Error
- Simulasi Stack dalam dunia nyata
- Pemanggilan fungsi/procedure
- Rekursif
- Penanganan Interupsi
- Evaluasi Ekspresi
- Konversi Notasi Infiks ke Notasi Postfiks
- Konversi Sistem Bilangan, misalnya dari Basis 10 (Desimal) ke Basis 2 (Biner)
- Kalikan nilai B terhadap nilai C.
- Jumlahkan nilai A terhadap hasil perkalian di atas.
- Jumlahkan nilai A terhadap nilai B.
- Kalikan hasil perjumlahan di atas terhadap nilai B.
- Notasi Infiks : A + B
- Notasi Prefiks : + A B
- Notasi Postfiks : A B +
Postfiks : 3E-
Postfiks : 3E- = A2E- = A1D/E- = ABC*D/E-

Postfiks : 3E-



Prefiks : -3E
Prefiks : -3E = -+A2E = -+A/1DE = -+A/*BCDE
- String infiks merupakang suatu ekspresi infiks tak bertanda kurung valid.
- Satu Stack diinisiasikan kosong.
- String postfiks diinisiasikan dengan nn (null string) untuk menampung hasil konversi.
- Perhatikan tingkat kekutan/prioritas simbol, pada Tabel di bawah.
- Jika tingkat kekuatan simbol di Stack Lebih Besar atau Sama Dengan tingkat kekuatan simbo yang di scan maka simbo yang di Stack Disambung (Concate) dengan string postfiks.
- Jika tingkat kekuatan simbol di Stack Lebih Kecil dengan tingkat kekuatan simbol yang di scan atau Stack Kosong maka simbol yang di scan Dimasukkan (PUSH) ke dalam Stack.
- Jika infiks telah Kosong maka POP semua isi Stack satu persatu dan Concate dengan string postfiks.
- String infiks merupakan suatu ekspresi infiks bertanda kurung valid.
- Tanda kurung buka pada string infiks masuk ke Stack tetapi tidak masuk ke dalam string postfiks.
- Tanda kurung buka pada stack nilai prioritasnya berubah menjadi 0.
- Tanda kurung tutup di-scan maka elemen puncak Stack hingga kurung buka di concate terhadap string postfiks.
- Tanda kurung tutup tidak pernah masuk ke dalam Stack.
- Jika prioritas simbol di Stack (fungsi g) lebih besar dengan prioritas simbol yang di scan (fungsi f) maka simbol yang di Stack disambung (Concate) dengan string Postfiks.
- Jika tingkat kekuatan simbol di Stack lebih kecil atau sama dengan tingkat kekuatan simbol yang di scan atau Stack kosong maka simbol yang di scan dimasukkan (PUSH) ke dalam Stack.
- Buat Stack kosong.
- Ambil elemen satu persatu dari kiri.
- Jika elemen itu adalah operand maka masukkan ke Stack, dan jika operator maka keluarkan dua nilai teratas dari Stack (operand2 dan operand1) lalu hitung dengan operator yang bersangkutan, hasilnya masukkan ke dalam Stack. Perlu diperhatikan bahwa jika tidak ada 2 operand dalam Stack, maka ada kesalahan pada notasi tersebut.
- Ulangi langkah ke-2 dan ke-3 sampai elemen dalam notasi postfiks habis. Jika telah habis, maka elemen yang tinggal adalah elemen hasil.
![]() |
| Operasi Evaluasi Ekspresi 7 8 2 * 4 / – 3 2 ^ + |
- Buat Stack kosong.
- Ambil elemen satu persatu dari kanan.
- Jika elemen itu adalah operand maka masukkan ke Stack, dan jika operator maka keluarkan dua nilai teratas dari Stack (operand1 dan operand2) lalu hitung dengan operator yang bersangkutan, hasilnya masukkan ke dalam Stack. Perlu diperhatikan bahwa jika tidak ada 2 operand dalam Stack, maka ada kesalahan pada notasi tersebut.
- Ulangi langkah ke-2 dan ke-3 sampai elemen dalam notasi prefiks habis. Jika telah habis, maka elemen yang tinggal adalah elemen hasil.
![]() |
| Operasi Evaluasi Ekspresi + – 7 / * 8 2 4 ^ 3 2 |
#include <iostream.h>#include <conio.h>#define MaxS 10struct Stack {char Isi[MaxS];unsigned int Top;};void INITS (Stack &S);void PUSH(Stack &S, char Data);void CETAK(Stack S);void POP(Stack &S, char &Hsl);main() {char huruf;Stack S;INITS(S);cout<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);cout<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);cout<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);CETAK(S);POP(S,huruf);cout<<endl<<"Yang Dihapus ...."<<huruf;CETAK(S);cout<<endl<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);cout<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);cout<<"Masukkan Karakter :";cin>>huruf;PUSH(S,huruf);CETAK(S);POP(S,huruf);cout<<endl<<"Yang Dihapus ...."<<huruf;CETAK(S);getch();}void INITS (Stack &S) {S.Top = 0;}void PUSH(Stack &S, char Data) {if (S.Top < MaxS) {S.Top++;S.Isi(S.Top) = Data;}elsecout<<"Stack Penuh ......";}void CETAK(Stack S) {int i;cout<<endl<<"Isi Stack : ";if (S.Top != ) {for(i=1;i<=S.Top;i++) {cout<<S.Isi[i];}}else {cout<<"Stack Kosong ....";}}void POP(Stack &S, char &Hsl) {if (S.Top != 0) {Hsl = S.Isi[S.Top];S.Top--;}else {cout<<"Stack Kosong ....";}}
#include<iostream.h>#include<conio.h>#include<stdlib.h>#define true 1#define false 0typedef struct node *simpul;struct node {char Isi;simpul next;};//======================//==Prototype Function==//======================void Sisip_Belakang(simpul &L, char elemen);void Hapus_Belakang(simpul &L);void Cetak(simpul L);//=================//==Function Main==//=================main() {char hurufsimpul L = NULL //Pastikan bahwa L kosongcout<<"==OPERASI SINGLE LINKED LIST PADA STACK==\n\n";//==================//==Sisip Belakang==//==================cout<<endl<<endl<<"Penyisipan Stack "<<endl<<endl;cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L, huruf);cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L,huruf);cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L, huruf);cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L,huruf);cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L,huruf);cout<<"Masukkan Elemen :"; cin>>huruf;Sisip_Belakang(L,huruf);Cetak(L);//=========================//==Hapus Simpul Belakang==//=========================cout<<endl<<endl<<"Hapus Elemen "<<endl;Hapus_Belakang(L);Cetak(L);cout<<endl<<endl<<"Hapus Elemen "<<endl;Hapus_Belakang(L);Cetak(L);cout<<endl<<endl<<"Hapus Elemen "<<endl;Hapus_Belakang(L);Cetak(L);cout<<endl<<endl<<"Hapus Elemen "<<endl;Hapus_Belakang(L);Cetak(L);getch();}//*************************************//**FUNCTION SISIP SIMPUL DI BELAKANG**//*************************************void Sisip_Belakang(simpul &L, char elemen) {simpul bantu, baru;baru = (simpul) malloc(sizeof(simpul));baru->Isi = elemen;baru->Next = NULL;if(L == NULL)L=baru;else {bantu=L;while(bantu->next != NULL) {bantu=bantu->next;}bantu->next=baru;}}//**********************************//**FUNCTION HAPUS SIMPUL BELAKANG**//**********************************void Hapus_Belakang(simpul &L) {simpul bantu, hapus;if(L==NULL) {cout<<"Linked List Kosong .................";}else {bantu = L;while(bantu->next->next != NULL)bantu=bantu->next;hapus = bantu->next;bantu->next = NULL;free(hapus);}}//*************************************//**FUNCTION MENCETAK ISI LINKED LIST**//*************************************void Cetak(simpul L) {simpul bantu;if(L==NULL) {cout<<"Linked List Kosong .................";}else {bantu=L;cout<<endl<<"Isi Linked List : ";while (bantu->next != NULL) {cout<<bantu->Isi<<"->";bantu=bantu->next;}cout<<bantu->Isi;}}
#include<iostream.h>#include<conio.h>#define Max 20struct Stack {char Isi[Max+1];unsigned int top1;unsigned int top2;};void init (Stack &S);void Push(Stack &S, int nostack, char Data);void baca(Stack S, int nostack);void Pop(Stack &S, char &Hsl, int nostack);int Full(Stack S);int empty(int nostack);void clear(Stack &S, int nostack);main() {char huruf;Stack S;int k, nomor;init(S);cout<<"Mengisi Stack Pertama..."<<endl<<endl;for(k=1;k<=5;k++) {cout<<"Masukkan Karakter :";cin>>huruf;Push(S,1,huruf); //mengisi huruf ke Stack1}baca(S,1); //mencetak isi Stack Pertamacout<<"\n\nMengisi Stack Kedua..."<<endl<<endl;for(k=1;k<=5;k++) {cout<<"Masukkan Karakter :";cin>>huruf;Push(S,2,huruf); //mengisi huruf ke Stack2}baca(S,2); //mencetak isi Stackcout<<"\n\nmenghapus elemen Stack Pertama..."<<endl;Pop(S,huruf,1); //Menghapus elemen puncak Stack;cout<<"elemen Yang dihapus : "<<huruf<<endl;baca(S,1); //mencetak isi Stackcout<<"\n\nmenghapus elemen Stack Kedua..."<<endl;Pop(S,huruf,2); //Menghapus elemen puncak Stack 2cout<<"elemen Yang dihapus : "<<huruf<<endl;baca(S,2); //mencetak isi Stackcout<<"\n\nMengisi Stack Kedua...\n\n";for(k=1;k<=3;k++) {cout<<"Masukkan Karakter :";cin>>huruf;Push(S,2,huruf); //mengisi huruf ke Stack2}baca(S,2); //mencetak isi Stackcout<<"\n\nmenghapus elemen Stack Kedua..."<<endl;Pop(S,huruf,2); //Menghapus elemen puncak Stack 2cout<<"elemen Yang dihapus : "<<huruf<<endl;baca(S,2); //mencetak isi Stack 2cout<<"\n\nmenghapus elemen Stack Kedua..."<<endl;Pop(S,huruf,2); //Menghapus elemen puncak Stack 2cout<<"elemen Yang dihapus : "<<huruf<<endl;baca(S,2); //mencetak isi Stack 2cout<<"Masukkan Karakter : "; cin>>huruf;cout<<"Masukkan Nomor Stack : "; cin>>nomor;Push(S,nomor,huruf);baca(S,nomor);for(k=1;k<=3;k++) {cout<<"Masukkan Karakter : "; cin>>huruf;cout<<"Masukkan Nomor Stack : "; cin>>nomor;Push(S,nomor,huruf);}baca(S,1);baca(S,2);getch();}/* =====================Fungsi Inisiasi===================== */void init(Stack &S) {S.top1 = 0;S.top2 = Max+1;}/* =======================================Fungsi Memasukkan Elemen ke Stack======================================= */void Push(Stack &S, int nostack, char Data) {if(Full(S) != true) {switch(nostack) {case 1 : S.top1++;S.Isi[S.top1] = Data;break;case 2 : S.top2--;S.Isi[S.top2] = Data;break;default: cout<<"Invalid PUSH..."<<endl;break;}}else {cout<<"Stack Over....."<<endl;}}/* ========================================Fungsi Menghapus Elemen dari Stack======================================== */void Pop(Stack &S, char &Hsl, int nostack) {switch (nostack) {case 1 : Hsl = S.Isi[S.top1];S.top1--;break;case 2 : Hsl = S.Isi[S.top2];S.top2++;break;default: cout<<"invalid POP...."<<endl;break;}}/* ===============================Fungsi Mengosongkan Stack=============================== */void clear(Stack &S, int nostack) {switch(nostack) {case 1 : S.top1 = 0;break;case 2 : S.top2 = Max+1;break;default: cout<<"Nomor Stack Invalid...\n";break;}}/* =================Fungsi FULL================= */int Full(Stack S) {if(S.top1 + 1 >= S.top2) return (true);else return(false);}/* ==========================================Fungsi Membaca/Mencetak Elemen Stack========================================== */void baca(Stack S, int nostack) {int i;switch(nostack) {case 1 : cout<<"Isi Stack Pertama : ";for(i=1;i<=S.top1;i++)cout<<S.Isi[i];break;case 2 : cout<<endl<<"Isi Stack Kedua : ";for(i=Max;i>=S.top2;i--)cout<<S.Isi[i];}cout<<endl;}
#define MaxQ N
#define true 1
#define false 0
struct Queue
{
TypeData Isi[MaxQ+1];
TypeData Depan;
TypeData Belakang;
};
void INITS (Queue &Q)
{
Q.Depan = 1;
Q.Belakang = 0;
}
int Empty (void)
{
if(Q.Belakang == 0) return (trues);
else return(false)
}
int FULL (void)
{
if(Q.Belakang == MaxQ) return(trues);
else return(false)
}
void KOSONG(Queue &Q)
{
Q.Belakang=0;
}
void EnQueue(Queue &Q, typeData Data)
{
if (Q.Belakang < MaxQ)
{
Q.Belakang++;
Q.Isi(Q.Belakang) = Data;
}
else
cout<<"Queue Penuh .......";
}
void CETAK(Queue Q)
{
int;
cout<<endl<<"Isi Queue : ";
if(Q.Belakang >= Q.Depan)
{
for(i=1;i<=Q.Belakang;i++)
{
cout<<Q.Isi[i];
}
}
else
cout<<"Queue Kosong....";
}
![]() |
| Circular Queue dengan 8 Elemen |
#define MaxQ N
struct Queue
{
TypeData Isi[MaxQ+1];
TypeData Depan;
TypeData Belakang;
};
void INITS(Queue &Q)
{
Q.Depan = 1;
Q.Belakang =0;
}
![]() |
| Operasi Penyisipan Elemen Pada Circular Queue |
![]() |
| Queue Penuh |
void ENQUEUE (Queue &Q, typeData Data)
{
if((Q->Belakang==MaxQ) && (Q->Depan==1)) || (Q->Depan-Q->Belakang == 1)
cout<<"Queue Penuh ....";
else
{
if(Q->Belakang == MaxQ) && (Q->Depan > i)
Q->Belakang = 1;
else
Q->Belakang++;
Q->Isi(Q->Belakang)=Data;
}
}
- Kosong (Empty) adalah jika Depan = 1 dan Belakang = 0 (Depan – Belakang = 1).
- Penuh (Full) adalah jika :
- Belakang = MaxQ dan Depan=1
- Depan – Belakang = 1
- Jika Depan = 3 dan Belakang = 6 maka isi Queue adalah {C, D, E, F}.
- Jika Depan = 6 dan Belakang = 3 maka isi Queue adalah {F, G, H, A, B, C}.
void DEQUEUE (Queue &Q, TypeData Hsl)
{
if (Q->Depan == 1) && (Q->Belakang==0)
cout<<"Queue Kosong...";
else
{
Hsl = Q->Isi(Q->Depan);
if(Q->Depan == MaxQ)
Q->Depan = 1;
else
Q->Depan++;
}
}
- Depan = 3 dan Belakang = 6, isi Queue {D, E, F}
- Depan = 6 dan Belakang = 3, isi Queue {G, H, A, B, C}
- Depan = 4 dan Belakang = 5, isi Queue {E}
- Depan = 5 dan Belakang = 4, isi Queue Full
- Depan = 5 dan Belakang = 5, Queue Kosong
void Init(Queue &Q)
{
Q->Depan := 1;
Q->Belakang := 1;
}
![]() | ||
| Operasi Penyisipan Elemen pada Circular Queue Diperbarui |
- Kosong jika Depan = Belakang
- Penuh jika Depan – Belakang = 1 atau Depan=1 dan Belakang=Maksimum
void ENQUEUE(Queue &Q, TypeDataElemen Data)
{
if(!(Full))
if(Q->Depan-Q->Belakang!=1) && ((Q.Depan==1) && (Q->Belakang == MaxQ))
{
if(Q->Belakang==MaxQ) && (Q->Depan>1)
Q->Belakang=1;
else
Q->Belakang++;
Q->Isi(Q->Belakang) = Data;
}
cout<<"Queue Penuh....";
}
int Full(Queue Q)
{
if(Q->Depan-Q->Belakang==1) || ((Q->Depan==1) && (Q->Belakang == MaxQ))
Full = true;
else
Full = false;
}
![]() |
| Operasi Penghapusan Elemen pada Circular Queue Diperbarui |
void DEQUEUE(Queue &Q, TypeDataElemen Hsl)
{
if(Q->Depan - Q->Belakang != 0)
{
if(Q->Depan == MaxQ)
{
Hsl = Q->Isi[l];
Q->Depan = 1;
}
else
{
Hsl = Q->Isi[Q->Depan+1];
Q->Depan++;
}
}
else
cout<<"Queue Kosong....";
}
#include<iostream.h>#include<conio.h>#include<stdlib.h>typedef struct node *simpul;struct node {char Isi;simpul next;};//======================//==Prototype Function==//======================void Sisip_Belakang(simpul &L, char elemen);void Hapus_Depan(simpul &L);void Cetak(simpul L);//==================//==Function Matin==//==================main() {char huruf;simpul L = NULL; //Patikan bahwa L kosongint i;cout<<"==OPERASI PADA SINGLE LINKED LIST=="<<endl<<endl;//=================//==Sisi Belakang==//=================cout<<"\nPenyisipan Simpul \n\n";for(i=1;i<=3;i++) {cout<<"Masukkan Huruf :";cin>>huruf;Sisip_Belaakng(L, huruf);}Cetak(L);//======================//==Hapus Simpul Depan==//======================cout<<"\nSetelah Hapus Simpul "<<endl;Hapus_Depan(L);Cetak(L);cout<<"\nSetelah Hapus Simpul "<<endl;Hapus_Depan(L);Cetak(L);cout<<"\nSetelah Hapus Simpul "<<endl;Hapus_Depan(L);Cetak(L);cout<<"\nPenyisipan Simpul \n\n";for(i=1;i<=3;i++) {cout<<"Masukkan Huruf : ";cin>>huruf;Sisip_Belakang(L, huruf);}Cetak(L);cout<<"\nSetelah Hapus Simpul "<<endl;Hapus_Depan(L);Cetak(L);cout<<"\nSetelah Hapus Simpul "<<endl;Hapus_Depan(L); {Hapus = L;L = L->next;Hapus->next = NULL;free(Hapus);}} //====================eof====================

.jpg)
















.jpg)

.png)
.png)
.png)