1. 程式人生 > >棧和佇列的基本操作

棧和佇列的基本操作

棧和佇列從某些方面還是比較像的,所以把這兩個合到一起復習

寫一下順序儲存棧和順序儲存佇列的基本操作

#include<iostream>
#include<stdlib.h>
#define Max 100

using namespace std;

typedef struct Stack{
    int *base;
    int *top;
    int stack_size;
}Stack;

typedef struct Queue{
    int *base;
    int first;
    int last;
}Queue;

void init_stack(Stack &A){
    A.base=(int *)malloc(Max*sizeof(int));
    A.top=A.base;
    A.stack_size=Max;
}

void init_queue(Queue &B){
    B.base=(int*)malloc(Max*sizeof(int));
    B.first=0;
    B.last=0;
}

void free_stack(Stack &exa){
    exa.top=NULL;
    free(exa.base);
    exa.stack_size=0;
}

void free_queue(Queue &exa){
    free(exa.base);
    exa.first=exa.last=0;
}

int check_stack(Stack exa){ //狀態碼:1為空,2為滿,3為其他,下同
    if(exa.base == exa.top)
        return 1;
    else if(exa.top - exa.base == exa.stack_size)
        return 2;
    else
        return 0;
}

int check_queue(Queue exa){
    if(exa.first==exa.last)
        return 1;
    else if( (exa.last+1)%Max == exa.first )
        return 2;
    else
        return 0;
}

int pop_stack(Stack &exa){
    if(check_stack(exa)!=1){
        return *(--exa.top);
    }
    else
        cout<<"棧為空,無法進行出棧操作"<<endl;
}

void push_stack(Stack &exa, int num){
    if(check_stack(exa)!=2){
        *(exa.top)=num;
        exa.top++;
    }
    else
        cout<<"棧已滿,無法進行入棧操作"<<endl;
}

int pop_queue(Queue &exa){
    if(check_queue(exa)!=1){
        int temp=*(exa.base+exa.first);
        exa.first=(++exa.first)%Max;
        return temp;
    }
    else
        cout<<"佇列為空,無法進行出佇列操作"<<endl;
}

void push_queue(int num,Queue &exa){
    if(check_queue(exa)!=2){
        *(exa.base+exa.last)=num;
        exa.last++;
    }
    else
        cout<<"佇列已滿,無法進行入佇列操作"<<endl;
}

void show_stack(Stack exa){
    int *temp=exa.base;
    if(check_stack(exa)==1){
        cout<<"空"<<endl;
        return;
    }
    while(temp!=exa.top){
        cout<< *(temp) <<" ";
        temp++;
    }
    cout<<endl;
}

void show_queue(Queue exa){
    int temp=exa.first;
    if(check_queue(exa)==1){
        cout<<"空"<<endl;
        return;
    }
    while(temp!=exa.last){
        cout<< *(exa.base+temp) <<" ";
        temp=(++temp)%Max;
    }
    cout<<endl;
}

void main_push_stack(Stack &exa){
    cout<<"請依次輸入要入棧的元素,以數字999結束"<<endl;
    int temp;
    while(1){
        cin>>temp;
        if(temp==999)
            break;
        push_stack(exa, temp);
    }
}

void main_pop_stack(Stack &exa){
    int temp, num;
    cout<<"請輸入出棧元素個數:"<<endl;
    cin>>num;
    cout<<"出棧元素依次為:";
    while(num--){
        temp=pop_stack(exa);
        cout<<temp<<" ";
    }
    cout<<endl;
}

void main_push_queue(Queue &exa){
    cout<<"請依次輸入要入佇列的元素,以數字999結束"<<endl;
    int temp;
    while(1){
        cin>>temp;
        if(temp==999)
            break;
        push_queue(temp,exa);
    }
}

void main_pop_queue(Queue &exa){
    int temp, num;
    cout<<"請輸入出佇列元素個數:"<<endl;
    cin>>num;
    cout<<"出佇列元素依次為:";
    while(num--){
        temp=pop_queue(exa);
        cout<<temp<<" ";
    }
    cout<<endl;
}

int main(){

    Stack A;
    init_stack(A);
    Queue B;
    init_queue(B);

    int choose;

    while(1){
        cout<<"**********************"<<endl;
        cout<<"棧的執行狀態:";
        show_stack(A);
        cout<<"佇列的執行狀態:";
        show_queue(B);
        cout<<"**********************"<<endl;

        cout<<"請選擇以下操作,輸入序號"<<endl;
        cout<<"1,入棧"<<endl;
        cout<<"2,出棧"<<endl;
        cout<<"3,入佇列"<<endl;
        cout<<"4,出佇列"<<endl;
        cout<<"0,退出"<<endl;

        cin>>choose;
        switch(choose){
        case 1:
            main_push_stack(A);
            break;
        case 2:
            main_pop_stack(A);
            break;
        case 3:
            main_push_queue(B);
            break;
        case 4:
            main_pop_queue(B);
            break;
        default:
            break;
        }
        system("CLS");
    }

    free_stack(A);
    free_queue(B);

    return 0;
}