20 Kasım 2012 Salı

STACK (YIĞIN)



Verilerin geçici olarak saklandığı bir yapıdır. Son giren ilk çıkar mantığı ile çalışır.(LİFO) Ara elemanlara doğrudan erişim yapılamaz.Genelde aynı tipte veriler tutulur. Aritmetik deyimlerin bilgisayar ortamında uygulamasında ( Infix, Postfix, Prefix) kullanılabilir. Ayrıca mikro işlemcinin iç yapısında stack adı verilen bir bölge vardır ve biz bunu farkında olmadan kullanırız.Mesela iki programı aynı anda çalıştırıyorken birinden diğerine geçtiğimizde interrupt işlemi gerçekleşir ve ilk program stackde kaydedilmiştir. Böylece ilk çalıştırdığımız programa geri döndüğümüzde kaldığımız yerden devam edebiliriz.
Aşağıda örnek olarak dizi tabanlı bir yığın oluşturan menü tabanlı c++ kodlu program verilmiştir. yığın boyutu 10 dur. Menüde Ekle, Getir, Listele, Say, Programdan Çık işlemleri bulunmaktadır.


yigin.h

#include <iostream>
#define n 10

class yigin
{
public:
yigin ();
int koy();
    int al();
    void temizle();
    int listele();
void say();
private:
int eklenecek;
};

yigin.cpp

#include <iostream>
#include "yigin.h"
using namespace std;
int yveri[n]={0};
int yi=0;
int sayac=0;

yigin::yigin()
{
eklenecek=0;
}
int yigin::koy()
{
cout<<"eklemek istediginiz sayiyi giriniz:";
cin>>eklenecek;

    if(yi>=n)
cout<<"yigin dolu!"<<endl;
    else
{
yveri[yi]=eklenecek;
        yi++;
        cout<<eklenecek<<" yigina eklendi\n"<<endl;
        sayac++;
}
return 0;
}

int yigin::al()
{
if(yi<=0)
cout<<"yigin bos";
       else{
            cout<<yveri[yi-1]<<" elemani yigindan cikarildi\n"<<endl;
            sayac--;
            return yveri[--yi];
  }
}



int yigin::listele()
{
int i;
    if(yi<=0)
    cout<<"yigin bos!!!\n";
else{
    for(i=0;i<sayac;i++){
     cout<<i+1<<".eleman="<<yveri[i]<<endl;
}
}
return 0;
    }
void yigin::say()
{
cout<<"eleman sayisi:"<<sayac;
}



yiginTest.cpp

#include <iostream>
#include "yigin.h"
using namespace std;


int main()
{   yigin y;
    char secim;
cout<<"yigina eklemek icin:'e'\nyigindan eleman cikarmak icin:'g'\nlistelemek icin:'l'\nsaymak icin:'s'\ncikis icin:'q'"<<endl;
    while(1)
    { 
            secim=getchar();
            switch(secim)
            { case 'e':
            y.koy();
break;
            case 'g':
                y.al();
                 
break;
  
     case 'l':
          y.listele();
          
 break;
          case 's':
               y.say();
  break;
 case 'q':
 return 0;
 
                          }
            }
    
  system ("PAUSE");
  return 0;
}


kuyruk

Dizi tabanlı bir dairesel kuyruk oluşturan menü tabanlı c++ kodlu program.




#include<iostream>
#include<cstdlib>
#define MAX_SIZE 10
using namespace std;
class Queue{
    private:
        int item[MAX_SIZE];
        int head;
        int tail;
    public:
        Queue();
        void enqueue(int);
        int dequeue();
        int size();
        void display();
        bool isEmpty();
        bool isFull();
};
Queue::Queue(){
    head = 0;
    tail = 0;
}
void Queue::enqueue(int data){
        item[tail] = data;
        tail = (tail+1)%MAX_SIZE;
}
int Queue::dequeue(){
    int temp;
    temp = item[head];
    head = (head+1)%MAX_SIZE;
    return temp;
}
int Queue::size(){
    return (tail - head);
}
void Queue::display(){
    int i;
    if(!this->isEmpty()){
        for(i=head; i!=tail; i=(i+1)%MAX_SIZE)
        {
            cout<<item[i]<<endl;
        }
    }else{
        cout<<"kuyruk boşaldı!"<<endl;
    }
}
bool Queue::isEmpty(){
    if(abs(head == tail)){
        return true;
    }else{
        return false;
    }
}
bool Queue::isFull(){
    if(head==(tail+1)%MAX_SIZE){
        return true;
    }else{
        return false;
    }
}
int main(){
    Queue queue;
    int data;
char choice;
    while(1){
        cout<<"\ne- Ekleme\ns- silme\ny- say\nl- listele\nq- cikis";
        cout<<"\nseciminiz: ";
        cin>>choice;
        switch(choice){
            case 'e':
            if(!queue.isFull()){
                    cout<<"\ndata girin: ";
                    cin>>data;
                    queue.enqueue(data);
            }else{
                cout<<"kuyruk dolu!"<<endl;
            }
            break;
            case 's':
            if(!queue.isEmpty()){
                cout<<"silinen eleman :"<<queue.dequeue();
            }else{
                cout<<"kuyruk bos!"<<endl;
            }
                break;
            case 'y':
                cout<<"eleman sayisi: "<<queue.size();
                break;
            case 'c':
                queue.display();
                break;
            case 'q':
                exit(0);
                break;
        }
    }
    return 0;
}