使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
自己阅读并且理解栈和队列的原理以及一些函数的用法:
栈是一种先进后出的数据结构,队列是一种先进先出的数据结构
栈和队列常用函数 | 返回值 |
---|---|
stack适配器定义在stack头文件 | |
stack默认基于deque实现 | |
stack<string, vector<string>> stack(svec); | 在vector容器上实现一个栈, 保存svec的拷贝 |
stack.pop(); | 删除栈顶元素, 不返回该元素值. |
stack.push(item); stack.emplace(args); | 创建一个新元素压入栈顶, 该元素通过拷贝或移动item, 或者由args构造 |
stack.top() | 返回栈顶元素, 但不将元素弹出栈. |
queue和priority_queue适配器定义在queue头文件 | |
queue默认基于deque实现, priority_queue默认基于 vector 实现 | |
queue.pop() priority_queue.pop() | 删除queue的首元素或删除priority_queue的最高优先级元素, 不返回该元素值. |
queue.front() queue.back() | 返回首元素或尾元素, 但不删除此元素(只适用于queue) |
priority_queue.top(); | 返回最高优先级元素, 但不删除该元素(只适用于priority_queue) |
queue.push(item); priority_queue.push(item); queue.emplace(args); priority_queue.emplace(args); | 在queue末尾或priority_queue中恰当位置创建一个元素, 其值为 item 或由 args 构造. |
思路:
栈是先进后出,先进入的元素就压入了栈底;队列是先进先出,后进入的元素在队列底部。如果要用栈模拟队列,我们可以使用两个栈,第一个栈顺序压入,然后第二个栈顺序取出然后顺序压入 ,这样我们得到的就是一个第一次进栈时完全相反的顺序。
代码:
class MyQueue {
public:
stack<int, vector<int>> stackin;
stack<int, vector<int>> stackout;
MyQueue() {
}
//将元素压入栈中
void push(int x) {
stackin.push(x);
}
//返回顶部元素并且删除该元素
int pop() {
if(stackout.empty()){
while(!stackin.empty()){
stackout.push(stackin.top());
stackin.pop();
}
}
int res = stackout.top();
stackout.pop();
return res;
}
//获取当前顶部元素
int peek() {
int res = this->pop();
stackout.push(res);
return res;
}
bool empty() {
if(stackout.empty() && stackin.empty()) return true;
return false;
}
};
225. 用队列实现栈
可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:代码随想录
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
思路:
队列是先进先出, 要模拟先进后出的栈, 只需要一个队列就能够完成. 如果要移除栈顶元素, 就必须把队列前面的元素全部提出再重新压入队列, 将队列最后的元素提到队列的首元素.
代码:
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 res = que.front();
que.pop();
return res;
}
int top() {
int res = this->pop();
que.push(res);
return res;
}
bool empty() {
return que.empty() ? true : false;
}
};
坚持, 加油