栈和队列
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;
}
注:栈和队列的题目正常的代码是这样的哦
制作不易,点个赞吧😘