232. 用栈实现队列
这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。
下面动画模拟以下队列的执行过程:
执行语句: queue.push(1); queue.push(2); queue.pop(); 注意此时的输出栈的操作 queue.push(3); queue.push(4); queue.pop(); queue.pop();注意此时的输出栈的操作 queue.pop(); queue.empty();
*****
思路(双栈模拟)
创建两个栈,一个存放原始数据,一个存放出战数据
stack<int> stIn;
stack<int> stOut;
push向队列加入数据
void push(int x) {
stIn.push(x);
}
pop 队列数据出战
判断出栈是否为空,为空进入判断
当入栈数据不为空时,向出栈压入 入栈的数据,压入后将入栈对应 数据弹出, 初始化一个结果数组,存放出栈数据,逐个将出栈数据 存入数组并将数据从出栈弹出。
int pop() {
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
while(!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
peek查看对列前面的数据
复用出对列函数,再将数据压回出栈 返回结果
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
225. 用队列实现栈*****
思路
用一个队列实现栈的所有操作
push操作:与栈一致
pop:
队列时先进先出 栈是先进后出
先将前n-1个元素从队列中弹出再插回队列中,然后再将我们需要弹出的元素弹出
int pop() {
int size = que.size();
size--;
while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
que.push(que.front());
que.pop();
}
int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
que.pop();
return result;
}
top:top函数 就是que的back函数
empty:empty函数就是que的empty函数