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学长提供以上题目练习)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值