[C++数据结构]:用栈创建队列、以及用队列实现栈
一、栈与队列的基础知识
手绘栈与队列的区别:
1.栈(Stack):
2.队列(Queue):
3.二者的遍历规则
栈:只有顶端元素可以访问,不允许挨个遍历
队列:只有队头和队尾可以访问和使用,不允许挨个遍历
4.常见的STL接口
栈:
stack<数据类型> name; //构造
push(值); //栈底添加
pop(); //出栈
top(); //返回栈顶元素
empty(); //判断栈是否为空
size(); //返回栈的大小
队列:
queue<类型> name; //构造
push(值) //队尾插入
pop() //从队头移除一个元素
back() //返回最后队尾第一个值
front() //返回第一个值
empty() //判断队列是否为空
size() //返回队列大小
二、用栈创建队列
推荐以力扣上的232题为基础学习:232. 用栈实现队列
模拟入队出队的过程:
class MyQueue {
public:
stack<int> queue_push; //定义入栈相当于入队的操作
stack<int> queue_back; //定义出栈相当于出队的操作
MyQueue()
{
}
void push(int x)
{
queue_push.push(x);
}
int pop()
{
if(queue_back.empty()) //如果为空则说明出队没有
{
while(!queue_push.empty()) //把入队中的所有数全部放入出队中
{
queue_back.push(queue_push.top()); //这个地方不能直接将pop()赋值传入,会报错
queue_push.pop();
}
}
int mid_num = queue_back.top();
queue_back.pop();
return mid_num;
}
int peek()
{
int pop_num = this->pop(); //复用pop()中返回队头的第一个元素
queue_back.push(pop_num); //因为该功能只是返回但是不移除,因此还要放进去
return pop_num;
}
bool empty()
{
return (queue_back.empty() && queue_push.empty());
}
};
注:在peek函数中,并没有重新定义,而是使用了之前的pop函数,第一如果重新写的话,提交会报错。第二这样可以提升代码的复用性。
三、用队创建栈
推荐以力扣上的225题为基础学习:225. 用队列实现栈
模拟入栈出栈的过程: 用一个队列就能够实现
class MyStack {
public:
queue<int> queue_stack;
MyStack()
{
}
void push(int x)
{
queue_stack.push(x);
}
int pop()
{
int peak = queue_stack.back();
while(queue_stack.front() != peak)
{
queue_stack.push(queue_stack.front());
queue_stack.pop();
}
int front_num = queue_stack.front();
queue_stack.pop();
return front_num;
}
int top()
{
return queue_stack.back();
}
bool empty()
{
return queue_stack.empty();
}
};
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!