欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序员代码面试指南---006由两个栈组成的队列

程序员文章站 2024-03-18 11:43:16
...

题目描述

用两个栈实现队列,支持队列的基本操作。

输入描述

第一行输入一个整数N,表示对队列进行的操作总数。

下面N行每行输入一个字符串S,表示操作的种类。

如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。

如果S为"poll",则表示弹出队列头部操作。

如果S为"peek",则表示询问当前队列中头部元素是多少。

输出描述

对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。

示例

输入:
6
add 1
add 2
add 3
peek
poll
peek
输出:
1
2

备注

1<=N<=1000000

-1000000<=X<=1000000

数据保证没有不合法的操作

解题思路

使用两个栈实现队列的基本操作,难点在于队列是先进先出,而栈是先进后出。
此时,一个栈模拟入队,一个栈模拟出队。
每次入队的时候,直接添加到入队栈,
每次出队的时候,需要先判断当前出队栈是否为空,为空则需要把入队栈中的元素全部放入出队栈中。然后再进行出栈操作。
每次获取队头元素的时候,也需要判断当前出队栈是否为空,操作与出队类似,只不过不弹出元素,获取元素即可。

实现代码

/*
 * @Description: 
 * @Author: 
 * @Date: 2020-10-20 18:05:08
 * @LastEditTime: 2020-10-20 18:57:20
 * @LastEditors: Please set LastEditors
 */
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;

int main()
{

    int N;
    cin >> N;
    getchar();
    vector<string> arr(N);
    for (int i = 0; i < N; i++)
    {
        getline(cin, arr[i]);
    }
    stack<int> in_stack; //入队栈
    stack<int> out_stack; //出队栈
    for (int i = 0; i < arr.size(); i++)
    {
        string str = arr[i].substr(0, 3);
        if (str == "add")
        {
            int num = atoi(arr[i].substr(3).c_str());
            //入队
            in_stack.push(num);
        }
        else if (str == "pol")
        {
            //出队
            if (out_stack.empty())
            { //出队栈为空
                while (!in_stack.empty())
                {
                    int top = in_stack.top();
                    in_stack.pop();
                    out_stack.push(top);
                }
            }
            out_stack.pop();
        }
        else if (str == "pee")
        {
            //获取队头元素
            if(out_stack.empty()){
                //出队栈为空
                while (!in_stack.empty())
                {
                    int top = in_stack.top();
                    in_stack.pop();
                    out_stack.push(top);
                }
            }
            cout << out_stack.top() << endl;
        }
    }
    //system("pause");
    return 0;
}

上一篇: 自定义队列

下一篇: 自定义队列