10.栈stack与队列queue

本文介绍了栈和队列这两种基本的数据结构及其应用场景,并详细探讨了如何使用两个栈来模拟队列的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈(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");
}

那用两个队列如何模拟栈呢,这个就不再这里实现了,其原理都是把握队列和栈的性质。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值