基础概念:
对列:先进先出
栈:先进后出
LeetCode 232- 用栈实现队列
题目链接:力扣
题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
解题思路
- 使用两个栈,stOut和stIn,stIn负责接收压栈,stOut负责输出栈中数据。
- push时就直接压入StIn,当要pop()时,就得判断,首先是若stOut不为空,则直接pop(),若为空,则首先将stIn里的数据全部压入至stOut中后再进行pop()操作。peek也是一样。
class MyQueue { public: stack<int> stIn; stack<int> stOut; MyQueue() { } void push(int x) { stIn.push(x); } int pop() { if(stOut.empty()){//若stOut为空才将stIn中数据压入 while(!stIn.empty()){ stOut.push(stIn.top()); stIn.pop(); } } int result = stOut.top();//不为空时直接pop() stOut.pop(); return result; } int peek() { int result = this->pop(); stOut.push(result); return result; } bool empty() { return stOut.empty() && stIn.empty(); } };
总结:
- 本来感觉很简单,看起来不难,但实现还是发现要花点时间,还是得多做,想是没有用的。
LeetCode 225- 用队列实现栈
题目链接:力扣
题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
解题思路
- 此题有两种方法,一种一个队列,第二种方法只用一个队列。
- 用两个队列时,其实第二个队列就是起备份的作用,因为队列只能先进先出,不管怎么进出,都是那个顺序。所以可以将第一个队列中元素全部出列,留下最后一个,来实现pop()和top()操作,实现后再将全部元素push回来。
- 用一个队列时,就是保存最后一个元素,然后将其他所有元素都push到它的后面,转一圈。
class MyStack { public: queue<int> quIn; queue<int> quOut; MyStack() { } void push(int x) { quIn.push(x); } int pop() { while(quIn.size() > 1){//元素只留最后一个,大于一就一直出列 quOut.push(quIn.front()); quIn.pop(); } int result = quIn.front(); quIn.pop();//获取最后一个元素 while(!quOut.empty()){//获取后再将元素全部push回去 quIn.push(quOut.front()); quOut.pop(); } return result; } int top() { while(quIn.size() > 1){//和pop操作差不多 quOut.push(quIn.front()); quIn.pop(); } int result = quIn.front(); quOut.push(quIn.front()); quIn.pop(); while(!quOut.empty()){ quIn.push(quOut.front()); quOut.pop(); } return result; } bool empty() { return quIn.empty() && quOut.empty(); } };
class MyStack { public: queue<int> qe; MyStack() { } void push(int x) { qe.push(x); } int pop() { int size = qe.size(); while(size>1){ int tmp =qe.front(); qe.pop(); qe.push(tmp); size--; } int tmp = qe.front(); qe.pop(); return tmp; } int top() { int result = this->pop(); qe.push(result); return result; } bool empty() { return qe.empty(); } };
总结:
- 自己只想到了俩队列实现,一个队列的实现是看了思路才写出来的。