11-用两个栈实现一个队列

基本思想:

两个栈A/B,将A看做缓存,每次入栈进A,然后A信息出栈后倒叙进B栈,向外输出时从B栈输出。需要注意A栈向B栈同步信息时需要先保证B栈已全部输出


(西交wrong):

#include <iostream>
#include <stack>
#include <stdio.h>
#define ERR -99999999

using namespace std;

stack<int> st1,st2;
bool push(int x)
{
    st1.push(x);
    return 1;
}
bool pop()
{
    int x;
    if(st2.empty())
        while(!st1.empty())  //A栈信息同步B栈
        {
            x = st1.top();   //取st1的栈顶元素保存在x中
            st1.pop();       //从st1中将已取的栈顶元素弹出
            st2.push(x);     //将st1中取出的元素保存在B中
        }
    if(st2.empty()) return 0;//如果执行过A同步后B仍然为空,说明A也为空,是否应对A状态判断?
    st2.pop();
    return 1;
}
int que_front()             //返回队首元素
{
    int x;
    if(st2.empty())
        while(!st1.empty())  //A栈信息同步B栈
        {
            x = st1.top();   //取st1的栈顶元素保存在x中
            st1.pop();       //从st1中将已取的栈顶元素弹出
            st2.push(x);     //将st1中取出的元素保存在B中
        }
    if(st2.empty()) return ERR;//如果执行过A同步后B仍然为空,说明A也为空,是否应对A状态判断?
    return st2.top();
}
int main()
{
    int n;                      //n为操作个数
    char op[10];                //判断输入操作
    int ret;                    //ret保存返回值
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",&op);
        if(op[0] == 'q')
            {
                ret = que_front();
                if(ret != ERR)
                    printf("front is %d\n",ret);
                else
                    printf("front isn't exist\n");
            }
            else if(op[0] == 'p' && op[1] == 'o')
            {
                ret =pop();
                if(ret) printf("success pop\n");
                else printf("fail pop\n");
            }
            else if((op[0] == 'p') && (op[1] == 'u'))
            {
                int x;
                scanf("%d",&x);
                ret = push(x);
                if(ret) printf("success push\n");
                else printf("fail push\n");
            }
    }

    return 0;
}

(感谢西交wrong学长提供以上题目练习)

猜你喜欢

转载自blog.csdn.net/outer_star/article/details/82053741