c++栈和队列

栈和队列

1.概念

今天我们要了解的是两个新的数据结构,但是数据结构是什么呢?
数据结构是计算机存储,组织数据的方式。它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构设计相适应的算法。通常情况下,精心选择的数据结构可以带来更高的运行或者储存效率。简而言之,算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的物理存储结构
按照数据的逻辑结构对其进行简单的分类:
①线性结构(一对一关系)
②树形结构(一对多关系)
③图形结构(多对多关系)
常用的线性结构有:一维数组,链表,栈,队列,双队列等
栈(stack),又称堆栈,是只能在某一端插入和删除的特殊线性表
特性:先进后出(FILO,first in last out)
进行插入和删除的一端称为栈顶(top),另一端称为栈底,插入一般称为进栈(push),删除则称为退栈出栈(pop)
栈的图例
**队列(queue)**是允许在表的两端进行不同操作的特殊线性表
特性:先进先出(FIFO,first in first out)
进行删除的一端为队头(head),进行插入操作的另一端称为队尾(tail)。插入一般称为入队,删除一般称为出队
队列的图例
我们来对比一下栈和队列~

项目队列
特性先进后出先进先出
插入的地方栈顶队尾
删除的地方栈顶队头
是否有封死有(栈底)
插入称为进栈入队
删除称为出栈/退栈出队
插入函数.push(插入的数).push(插入的数)
删除函数.pop().pop()
取首元素函数.top().front()
计算元素数量函数.size().size()
判断是否为空函数.empty().empty()
使用这些函数需要的头文件#include<stack>#include<queue>
定义stack<数据类型> 变量名;queue<数据类型> 变量名

可见它们还是有很多相似之处的哦~
★总的来说呢,这节的概念比较多,题目做起来还是很简单的~

2.例题

2.1 关于栈

2.1.1 题目

题目描述
栈是一种线性表,只允许从栈的顶部加或者删除数据,满足所谓的“先进后出”的原则。
然后你要实现一个栈,支持如下功能:
1、加一个元素到栈里:push()
2、删除栈顶的元素: pop()
3、 读取栈顶部元素的值: top()
4、读取栈中元素的个数:size()
*5、判断栈中是否有元素:empty()
这个栈在一开始时是空的,里面没有元素。
输入格式:
第一行有一个整数n,意味着会有n次操作。
在接下来的n行里,每行一个操作。请阅读下面的样例,自己体会具体栈是如何操作的。
输出格式:
一行,从头到尾输出最终的栈里的数据,数据之间用空格隔开。
样例输入:

5
+9

+10

±20


样例输出:
10
范围: 1s, 256M
N<=1000, 元素不大于 int

2.1.2 分析

因为这个软件输入的问题,输入第五行应该是+ -20
通过输出我们可以推断出+表示入栈,-表示出栈,+ -20表示让-20入栈
这样程序就很好写了

2.1.3 题目
#include<bits/stdc++.h>
using namespace std;
int a[100];//数组模拟栈
int top=0;//栈顶所在的位置,还表示元素个数
void Push(int n){
	top++;
	a[top]=n;
}//入栈
void Pop(){
	top--;
}
int Top(){
	return a[top];
}//取出栈顶元素
int Size(){
	return top;
}//计算栈的元素数量
bool Empty(){
	return top==0;
}//判断栈是否为空
int main(){
	int n,x;
	char op;
	cin>>n;
	while(n--){
		cin>>op;
		if(op=='+'){
			cin>>x;
			Push(x);
		}else{
			Pop();
		}
	}
	while(Size()){//元素个数大于0
		cout<<Top()<<" ";
		Pop();
	}
	return 0;
}

注:我这里将所有的函数都写了一遍,没有用栈而是用了数组,是想让大家看到这些函数在库里面是怎么运行的,大家在做题的时候最好不要这样哦

2.2 关于队列你需要知道的事情

2.2.1 题目

队列是一种只允许队尾加入,队头删除的特殊的线性表。它满足所谓“先进先出”的原则。
接下去你需要实现一个队列,支持:
1、加一个元素到队列尾:push()
2、删除队头元素: pop()
3、 读取队头元素的值: front()
4、读取队列中元素的个数:size()
*5、判断队列中是否有元素:empty()
特殊的,一开始队列中没有任何元素。
输入格式
第一行一个整数n,表示共有n次操作。
接下来共n行,每行描述了一次操作(请看样例自行猜测操作的描述。
输出格式
输出一行,从头到尾输出最终的队列,数据间以单个空格隔开。
样例输入

5
+9

+10

± 20


样例输出:
-20
数据范围
1s 256m
n≤1000,元素大小不超过int

2.2.2 分析

还是输入法的问题。。。第五行的输入是+ -20
跟上面栈的题目是一样的,+表示入队,-表示出队,+ -20表示让-20入队
题目又可以做了~

2.2.3 代码
#include<bits/stdc++.h>
using namespace std;
queue<int> a;
int n,x;
int main()
{
	cin>>n;
	char op;
	while(n--){
		cin>>op;
		if(op=='+'){
			cin>>x;
			a.push(x);
		}else{
			a.pop();
		}
	}
	while(a.size()){
		cout<<a.front()<<" ";
		a.pop();
	}
	return 0;
}

注:栈和队列的题目正常的代码是这样的哦

制作不易,点个赞吧😘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值