参考资料:
https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.htmlhttps://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
思路分析:
关键:pop()实现
peek() :头部元素获取
直接利用现有的pop()方法获取,再将元素加回进stkOut出栈中。
代码实现:
class MyQueue {//用栈的结构 造出 队列
public:
stack<int> stkIn;//入栈
stack<int> stkOut;//出栈
MyQueue() {
}
void push(int x) {//进队列
stkIn.push(x);
}
int pop() {//出队列
//只有出栈为空时,才将入栈中全部元素导入
if(stkOut.empty()){
while(!stkIn.empty()){//全部导入
stkOut.push(stkIn.top());
stkIn.pop();
}
}
int result=stkOut.top();
stkOut.pop();
return result;
}
int peek() {//返回队列头部元素
int temp=this->pop();//直接用pop()方法获取头部元素
stkOut.push(temp);//再加回去 出栈中
return temp;
}
bool empty() {
if(stkOut.empty() && stkIn.empty()) return true;
return false;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
思路分析:
关键:pop()实现
top() :栈头部元素获取
栈的顶部就是队列的尾部,获取队列尾部元素即可。
代码实现:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);//入的都是一样,关键是出
}
int pop() {
int size=que.size();
size--;
while(size--){//将最后一个之前的元素依次加入队列末尾
que.push(que.front());
que.pop();
}
int result=que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
if(que.empty()) return true;
return false;
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/