232用栈实现队列(使用两个栈模拟队列的两头)

1、题目描述

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

2、示例

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

3、题解

解法一:

基本思想:使用两个栈,入队O(n),出队O(1)。当栈push新进来一个元素val,则将栈里原来的所有元素依次出栈,val入栈,重新依次入栈,这样就使得新元素val位于栈底了而且原来元素顺序不变。

解法二:

基本思想:使用两个栈,入队O(1),出队O(1)。相当于模拟队列的两头一个栈模拟入队一头,一个栈模拟出队一头。

#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
using namespace std;
class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {
		//基本思想:使用两个栈,入队O(n),出队O(1)
		//当栈push新进来一个元素val,则将栈里原来的所有元素依次出栈,val入栈,重新依次入栈,这样就使得新元素val位于栈底了而且原来元素顺序不变
    }
    /** Push element x to the back of queue. */
    void push(int x) {
        stack<int> st_temp;
        while (!st.empty())
        {
            int temp = st.top();
            st.pop();
            st_temp.push(temp);
        }
        st.push(x);
        while (!st_temp.empty())
        {
			int temp = st_temp.top();
			st_temp.pop();
			st.push(temp);
        }
    }
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        int temp = st.top();
        st.pop();
        return temp;
    }
    /** Get the front element. */
    int peek() {
        return st.top();
    }
    /** Returns whether the queue is empty. */
    bool empty() {
        return st.empty();
    }
private:
    stack<int> st;
};
class MyQueue1 {
public:
	/** Initialize your data structure here. */
	MyQueue1() {
		//基本思想:使用两个栈,相当于模拟队列的两头一个栈模拟入队一头,一个栈模拟出队一头
	}
	/** Push element x to the back of queue. */
	void push(int x) {
        st1.push(x);
	}
	/** Removes the element from in front of queue and returns that element. */
	int pop() {
        if (!st2.empty())
        {
            int temp = st2.top();
            st2.pop();
            return temp;
        }
		while (!st1.empty())
		{
			int temp = st1.top();
			st1.pop();
			st2.push(temp);
		}
		int temp = st2.top();
		st2.pop();
		return temp;
	}
	/** Get the front element. */
	int peek() {
        if (!st2.empty())
            return st2.top();
        while (!st1.empty())
        {
            int temp = st1.top();
            st1.pop();
            st2.push(temp);
        }
		return st2.top();
	}
	/** Returns whether the queue is empty. */
	bool empty() {
        return st1.empty() && st2.empty();
	}
private:
	stack<int> st1;
	stack<int> st2;
};
int main()
{
	MyQueue1 queue;
	queue.push(1);
	queue.push(2);
    cout << queue.peek() << endl;  // 返回 1
    cout << queue.pop() << endl;   // 返回 1
    cout << queue.peek() << endl;  // 返回 2
    cout << queue.empty() << endl; // 返回 false
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值