栈(stack)是最常见的数据结构,其特性是“先进后出”。栈有进栈(push)和出栈(pop)两个操作,如同把一个个月饼装进(push过程)盒子,你若想拿到最下面的月饼,则需要把盒子上面的月饼一一取出(pop过程)。
栈的应用:
后缀表达式
操作符在操作数后面的表达式叫后缀表达式,中缀转化为后缀表达式后,利用出栈和入栈则可以计算出表达式的结果。
在这里不再分析,因为前面有博客写过。
队列(queue)则和栈不同,队列特点则是“先进先出”。队列有进队(push)和出队(pop)两个操作,如同在银行排队取钱,排在前面的先受理(pop),而后面进来的只能排进队尾(push)。
队列应用:
二叉树的宽度优先搜索(BFS)
在对二叉树进行遍历时,从队列中取出根节点进行对应处理,判断其是否存在子节点,存在则把子节点入队。循环至队列为空时,则把二叉树遍历完。
利用两个栈实现队列:
栈的特点是先进后出,而队列则是先进先出,那么怎样用两个栈实现一个队列呢?
抽象的数据结构体如下:
struct Queue
{
Stack stack1;
Stack stack2;
int size=0;
void push(dataValue);
void pop();
dataType top();
bool empty();
};
可以采用栈1存放进队的数据,而需要出队的时候,再把栈1的元素压入栈2,然后对栈2进行出栈,则可以完成队列的模拟。
#include<iostream>
#include<stack>
using namespace std;
struct Queue
{
stack<int>stack1;
stack<int>stack2;
int size = 0; //队列的大小
int top(); //返回队列的顶部元素
void push(int dat); //入队
void pop(); //出队
bool empty(); //判断是否为空
};
void Queue::push(int dat)
{
while(!stack2.empty())
{
int dat=stack2.top();
stack2.pop();
stack1.push(d);
}
stack1.push(dat);
size++;
}
void Queue::pop()
{
while (!stack1.empty())
{
int dat = stack1.top();
stack2.push(dat);
stack1.pop();
}
stack2.pop();
size--;
}
int Queue::top()
{
while (!stack1.empty())
{
int dat = stack1.top();
stack2.push(dat);
stack1.pop();
}
return stack2.top();
}
bool Queue::empty()
{
return size == 0 ? true : false;
}
void main()
{
Queue que;
que.push(10);
que.push(20);
while (!que.empty())
{
cout << que.top();
que.pop();
}
system("pause");
}
那用两个队列如何模拟栈呢,这个就不再这里实现了,其原理都是把握队列和栈的性质。