栈和队列的基本操作

栈和队列从某些方面还是比较像的,所以把这两个合到一起复习

写一下顺序存储栈和顺序存储队列的基本操作

#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;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值