题目地址:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题目示例
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
解题思路
栈的特性:先进后出
队列特性:先进先出
双栈实现队列:一个栈A只负责入队,另一个栈B只负责出队,入队的时候直接加入队尾就行,即将元素value直接压入输入栈A,而在出队的时候要分情况,根据队列先进先出的特性,在输出栈B为空的时候,将输入栈A的数据全部放入到输出栈B中,这样就相当于将A中的元素逆序输出到B中,在输出栈B不为空的时候,即B中有数据的时候,直接弹出栈顶元素即可,因为B的栈顶元素是A的栈底元素。
疑问:如何用队列实现栈的功能
队列实现栈:利用队列和栈的特性,我们将数据在队列中以栈的顺序存储好,然后完成栈的相关功能。
程序源码
双栈实现队列
class CQueue { stack<int>A; //入队栈 stack<int>B; //出队栈,即A的逆序输出 int size = 0; //在出队栈B中操作队列的首部 public: CQueue() { } void appendTail(int value) { //队尾添加元素=在入队栈A中直接压入元素 A.push(value); size++; } int deleteHead() { //在队头删除元素=在输出栈B中弹出栈顶元素 if(size == 0) return -1; //输出栈B为空 if(B.empty() && A.empty()) return -1; //输出栈为空并且输入栈也为空,因为当输出栈B为空时,要从输入栈A中取元素 if(B.empty() && !A.empty()) //输出栈B为空时,输入栈A不为空,则将输入栈A的元素装入B中,从而实现了A的逆序 { while(!A.empty()) { B.push(A.top()); A.pop(); } } int head=B.top(); //输出栈B不为空时,直接弹出栈顶元素,即删除队列的头部,也就是输入栈A的栈底元素 B.pop(); return head; } }; /** * Your CQueue object will be instantiated and called as such: * CQueue* obj = new CQueue(); * obj->appendTail(value); * int param_2 = obj->deleteHead(); */
队列实现栈
class MyStack { private: queue<int> que; public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { que.push(x); for (int i=0; i<que.size()-1; ++i){ que.push(que.front()); que.pop(); } } /** Removes the element on top of the stack and returns that element. */ int pop() { int res = que.front(); que.pop(); return res; } /** Get the top element. */ int top() { return que.front(); } /** Returns whether the stack is empty. */ bool empty() { return que.empty(); } };
参考文章