秒懂百科,C++如此简单丨第二十一天:栈和队列

爱编程的小芒果 2024-06-11 10:35:04 阅读 63

目录

前言

Everyday English

栈(Stack)

图文解释

实现添加删除元素

实现查看清空栈

完整代码

运行示例

栈的选择题

队列(Queue)

图文解释

队列的基本用法

完整代码 

运行结果 

队列的好处 

结尾 


前言

今天我们将学习两个新的数据结构——栈和队列。

Everyday English

A friend in need is a friend indeed.

患难见真情。

栈(Stack)

图文解释

栈最直白的想象就是羽毛球筒了(假设从一个口取)。

比如说我想按照红-橙-黄的顺序放进去,并取出橙色羽毛去,得进行以下操作:

1.放入红-橙-黄色羽毛球。

2.取出顶部的黄色羽毛球。

3.取出顶部的橙色羽毛球。

下面请欣赏我的纯手绘图片:

现在请你把注意力放在黄色羽毛球上,它在放进筒时是最后一个放进去的,而被取出来时是第一个被取出来的;而红色羽毛球却是最后一个被取出来的。所以栈有一个很重要的性质:

先进后出,后进先出(LIFO:Last in first out)

实现添加删除元素

添加:将元素入栈并使指针右移一位。

void add(int n)//添加元素至栈顶{ tmp++; a[tmp]=n;}

 删除:将元素出栈并使指针左移一位。

void pop()//删除栈顶元素{ a[tmp]=0;//这一步可要可不要 tmp--;}

实现查看清空栈

查看:把数组从1-tmp输出一下即可。

void look(int n[]){ for(int i=1;i<=tmp;i++) { cout<<n[i]<<" "; }}

清空:把数组归零,并把指针赋值为1。 

void empty(int n[]){ for(int i=1;i<=tmp;i++) { n[i]=0; } tmp=0;}

完整代码

#include<bits/stdc++.h>using namespace std;string op="";int a[1005],tmp=0,n;char b[1005],m;void add(int n)//添加元素至栈顶{tmp++; a[tmp]=n;}void pop()//删除栈顶元素{a[tmp]=0;//这一步可要可不要tmp--;}void look(int n[]){cout<<"The stack is:"; for(int i=1;i<=tmp;i++) { cout<<n[i]<<" "; }}void empty(int n[]){ for(int i=1;i<=tmp;i++) { n[i]=0; } tmp=0; cout<<"The stack is empty now."<<endl;}int main(){memset(a,0,sizeof(a));while(1){cin>>op;if(op[0]=='s') return 0;else {if(op[0]=='a') cin>>n,add(n);if(op[0]=='p') pop();if(op[0]=='l') look(a);if(op[0]=='e') empty(a);}}}

运行示例

add 1add 2add 3add 4poppoplookThe stack is:1 2add 5emptyThe stack is empty now.add 6lookThe stack is:6

栈的选择题

栈虽然编程中用的不是特别多,但是在CSP的第一轮考试中经常出现,我们来看一看。 

1.有6个元素,按照6、5、4、3、2、1的顺序入栈S,请问下列哪个出栈顺序是非法的?

A.5  4  3  6  1  2

B.4  5  3  1  2  6

C.3  4  6  5  2  1

D.2  3  4  1  5  6

题目来源:2022 CSP-J 选择第二题

解析:因为6比5先入栈,所以出栈时6应该在5后面,故选C。当然你也可以模拟一下。

2.对于入栈顺序为a,b,c,d,e的序列,下列( )不是合法的出栈序列。

A.a,b,c,d,e

B.e,d,c,b,a

C.b,a,c,d,e

D.c,d,a,e,b

题目来源:2021 CSP-J 选择题第五题

解析:因为a比b先入栈,所以出栈时a应该在b后面,故选D。当然你也可以模拟一下。

A.进栈一个,出栈一个

B.全部进栈,全部出栈

C.a进栈,b进栈,b出栈,a出栈,剩下的进栈一个,出栈一个。

D.无法完成

3.下图中所使用的数据结构是?

A、栈

B、队列

C、二叉树

D、哈希表

栈的性质是:后进先出,故选A。

队列(Queue)

图文解释

队列顾名思义就是排队买票,先买票的人总是先出来,最后买票的人最后出来。

如上图,1号游客最先排队,所以他第一个买票也是第一个出来的,这就是队列的重要性质:

先进先出,后进后出(FIFO:First in first out)

队列的基本用法

在C++中,已经有为我们写好的队列了,我们只需直接使用即可。

首先需要定义一个队列:

queue<变量类型> q;

这个变量类型可以是int,double,long long,struct...... 

下面是队列的几个基本用法:

q.pop() //弹出队首元素q.push(item) //把元素item插入到队尾q.empty() //如果队列为空返回True,否则返回Falseq.full() //如果队列已满返回True,否则返回Falseq.front() //调用队首元素q.size() //返回队列中元素的数量

完整代码 

#include<bits/stdc++.h>using namespace std;int main(){ queue<int> q; q.push(1); q.push(2); q.push(3); q.pop(); cout<<q.front()<<endl; q.pop(); cout<<q.size()<<endl; q.pop(); if(q.empty()) cout<<"The queue is empty."<<endl; return 0;}

运行结果 

21The queue is empty.

队列的好处 

等我们后面学到BFS时,会用到很多有关于队列的知识。

结尾 

本篇文章我们学习了栈和队列,图片为纯手绘无参考,制作不易,还请各位大佬三连支持一下



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。