225 队列实现栈
队列先进先出,栈先进后出。队列实现栈:插入元素的时候直接push进队列,同时记录最后一个入队的元素,此元素就是栈的top元素;队列为空的时候栈即空;比较麻烦的是pop,策略是依次取出队列最后一个元素(需要pop的元素)的元素,然后添加到队列后面,把原来队列最后面的元素放到第一个,然后pop掉;需要注意需要改变top元素的值,改成原来队列的倒数第二个元素
#include<iostream>
#include<queue>
using namespace std;
class MyStack {
public:
/** Initialize your data structure here. */
queue<int> que;
int top_elem;
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
que.push(x);
top_elem = x;
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int size = que.size();
while(size > 2) {
que.push(que.front());
size --;
que.pop();
}
if(size == 2) {
top_elem = que.front();
que.push(que.front());
que.pop();
}
int res = que.front();
que.pop();
return res;
}
/** Get the top element. */
int top() {
return top_elem;
}
/** Returns whether the stack is empty. */
bool empty() {
return que.empty();
}
};
/**
* 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();
*/
int main() {
}
232 用栈实现队列
s1用来push添加元素,s2用来top和pop,当s1 s2都为空的时候队列为空。
#include<iostream>
#include<stack>
using namespace std;
class MyQueue {
public:
stack<int> s1, s2;
/** Initialize your data structure here. */
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
s1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
int res = peek();
s2.pop();
return res;
}
/** Get the front element. */
int peek() {
if(s2.empty()) {
while (!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
/** Returns whether the queue is empty. */
bool empty() {
return s1.empty() && s2.empty();
}
};
/**
* 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();
*/