STACK DENGAN POINTER

Operasi-operasi stack secara lengkap adalah sebagai berikut :
Pendeklarasian stack dengan pointer
Proses pendeklarasian stack adalah proses pembuatan struktur stack dalam memori. Pendeklrasian dengan menggunakan pointer dibuat dua buah struktur yaitu data simpul yang berupa data dan pointer yang menunjuk ke simpul selanjutnya dan yang kedua struktur stack yang digunakan untuk menyimpan jumlah stack dan penunjuk posisi top dari stack:

Deklarasi Simpul/node :
struct node
{
   int bil;
   struct node *next;
};
Deklarasi stack dengan array:
struct stack
{
   int jumlah;
   struct node *top;
};

Inisialisasi
Inisialisasi stack adalah proses pembuatan suatu stack kosong. Proses inisialisasi untuk stack yang menggunakan pointer adalah dengan mengisi nilai field top dengan NULL.
stack.top=NULL;
Operasi Cek Kosong Stack
Operasi ini digunakan untuk memeriksa apakah stack dalam keadaan kosong. Operasi ini penting dilakukan dalam proses pop. Ketika suatu stack dalam keadaan kosong, maka proses pop tidak bisa dilakukan. Operasi ini dilakukan hanya dengan memeriksa jumlah elemen stack yang terbentuk. Jika jumlah bernilai 0, maka berarti stack dalam keadaan empty (kosong).
int cekKosong(stack *stack)
{
if(stack->jumlah==0)
return 1; else
return 0;
}

Operasi Cek Penuh
Operasi ini berguna untuk memeriksa keadaan stack apakah sudah penuh atau belum. Operasi ini akan memberikan nilai true (1) jika field top sama dengan size.
int cekPenuh(stack *stack)
{
if(stack->jumlah==size)
return 1;
else
return 0;
}

Operasi Push
Operasi ini berguna untuk menambah suatu elemen data baru pada stack dan disimpan pada posisi top yang akan mengakibatkan posisi top akan berubah. Langkah operasi ini adalah :
  1. Periksa apakah stack penuh. Jika tidak penuh maka proses push dilaksanakan dan jika stack penuh, maka proses push digagalkan.
  2. Proses push-nya sendiri dilakukan dengan menyambungkan simpul baru->next sama dengan stack->top, kemudian mengubah posisi top stack pada simpul baru dengan stack->top sama dengan baru, kemudian menambah jumlah simpul sebesar 1 dengan perintah stack->jumlah++.
 void Push(stack *stack) {
      node *baru;
 if (cekPenuh(stack))
 {
    cout<<"stack full";
    getch();
 }
 else
{
  baru=new(node);
  cout<<"\nmasukkan nilai yang ingin dipush ke stack: ";
  cin>>baru->bil;
  baru->next=stack->top;
  stack->top=baru;
  stack->jumlah++;
  cout<<"\nproses push sukses";
  getch();
 }
}

Operasi Pop 
Operasi ini berguna untuk mengambil elemen terakhir (top) dan kemudian menghapus elemen tersebut sehingga posisi top akan berpindah. Langkah operasi pop pada stack yang menggunakan pointer adalah terlebih dahulu memeriksa apakah stack sedang keadaan kosong, jika tidak kosong maka:
a. Gunakan variabel bantu hapusPtr untuk membaca simpul top stack
b. Pindahkan posisi top stack pada posisi sebelumnya
c. Kurangi jumlah simpul pada stack sebasar 1
d. Hapus simpul hapusPrt

void Pop(stack *stack)
 {
 node *hapusPtr;
 hapusPtr=stack->top; 
if (cekKosong(stack)) 

   cout<<"Stack Kosong";getch(); 
}
else 

   stack->top=stack->top->
   next; stack->jumlah--; 
   delete hapusPtr; cout<<"\nproses pop berhasil\n"; 
   getch(); 
 } 


Program Lengkap:
#include 
#include 
#define size 5  
struct node {
  int bil;
    struct node *next;
 };  
struct stack {
    int jumlah;
    struct node *top;
 };  
int cekPenuh(stack *stack) {
      if(stack->jumlah==size)
        return 1;
      else
        return 0;
 }  
int cekKosong(stack *stack) {
     if(stack->jumlah==0)
        return 1;
     else
        return 0;
 }  
void Push(stack *stack) {
      node *baru;
      if (cekPenuh(stack))
      {
        cout<<"stack full";
          getch();
      }
      else
      {
          baru=new(node);
          cout<<"\nmasukkan nilai yang ingin dipush ke stack: ";
          cin>>baru->bil;
          baru->next=stack->top;
          stack->top=baru;
          stack->jumlah++;
       }
 }  

void cetak(stack *stack) {
      node *bacaPtr;
      bacaPtr=stack->top;
      if(cekKosong(stack))
      {
        cout<<"\nstack kosong";
          getch();
      }
      else
      {
        clrscr();  
        cout<<"\nTOP\n";
        cout<<"---------\n";
        while(bacaPtr!=NULL)
          {
            cout<<bacaPtr->bil<<endl;
            cout<<"---------"<<endl;             
            bacaPtr=bacaPtr->next;
          }
          getch();
      }
 }   
void Pop(stack *stack) {
      node *hapusPtr;
      hapusPtr=stack->top;
      if (cekKosong(stack))
      {
        cout<<"Stack Kosong";
         getch();
      }
      else
      {
 
        stack->top=stack->top->next;
        stack->jumlah--;
        delete hapusPtr;
        cout<<"\nproses pop berhasil\n";
        getch();
      }
 }  
void Top(stack *stack) {
     int dataTop;
     if(cekKosong(stack))
     {
       cout<<"\ntop = NULL\n";
          getch();
     }
     else 
     {
       dataTop=stack->top->bil;
       cout<<"\ntop = "<<dataTop<<endl;
       getch();
     }
 }
 

  void hapus(stack *stack) {
     node *bantuHapus;
     while(stack->top!=NULL)
     {
        bantuHapus=stack->top;
        stack->top=stack->top->next;
        delete bantuHapus;
     }
     stack->jumlah=0;
 }
 void main()
 {
  stack stack;
  stack.jumlah=0;
  stack.top=NULL;
  char pilih;
  do
    {
     clrscr();
   cout<<"MENU STACK"<<endl;
   cout<<"[1]. Kosongkan Stack"<<endl;
   cout<<"[2]. Push"<<endl;
   cout<<"[3]. Pop"<<endl;
   cout<<"[4]. Lihat Top Stack"<<endl;   
   cout<<"[5]. Tampilkan stack"<<endl;      
   cout<<"[6]. Keluar\n"<<endl;
   cout<<"\npilihan: ";
       cin>>pilih;
   if(pilih=='1')
        hapus(&stack);
   if(pilih=='2')
    { 
      Push(&stack);
      cetak(&stack);
    }
   if(pilih=='3')
    {
      Pop(&stack);
      cetak(&stack);
    }   
   if(pilih=='4')
        Top(&stack);
   if(pilih=='5')
        cetak(&stack);
  }
while(pilih!='6');
 } 

0 komentar