目录
225.用队列实现栈
队列的话其实我们使用一个队列就可以实现栈了,实际上因为队列的方法比较多因此实现起来比栈要简单一些,这里面删除的最难。
删除思路:首先我们把除最后一位的数全部都重新添加再删除,让这些数跑到后面去,这样最后一位数就在第一位了。
class MyStack {
public:
queue<int, deque<int>> q;
MyStack() {}
void push(int x) {
q.push(x);
}
int pop() {
int len = q.size();
len--;//先把最后一位去掉
while(len--){
q.push(q.front());//把第一个数重新插进去
q.pop();//删掉原先第一个数
}
int result = q.front();//经过循环以后,原本的最后一位就变成了第一位
q.pop();
return result;
}
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
};
232.用栈实现队列
栈实现队列我们分成两种栈,一个负责接收,一个负责输出,输出的那个栈就相当于队列了,然后有删除就把接收栈里面的元素传到输出栈来删除。
class MyQueue {
public:
stack<int, vector<int>> s1;
stack<int, vector<int>> s2;
MyQueue() {}
void push(int x) {
s1.push(x);
}
int pop() {
if (s2.empty()) { //当s2是空的时候,就把s1里面的数传到s2里面
while (!s1.empty()) {//把s1里面的元素全送到s2里面,实现逆转
s2.push(s1.top());
s1.pop();
}
}
int val = s2.top();
s2.pop();
return val;
}
int peek() {
//这个pop是我们写的不是stl的,就在上面
int val = this->pop();//先弹出来取到值
s2.push(val);//在加回去,注意插的是s2(输出栈的)
return val; //反转后的s2相当于队列了
}
bool empty() {
return s1.empty() && s2.empty(); //因为s1和s2都有数,所以要两个都判断
}
};