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

目录

前言

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 1
add 2
add 3
add 4
pop
pop
look
The stack is:1 2
add 5
empty
The stack is empty now.
add 6
look
The 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,否则返回False
q.full() //如果队列已满返回True,否则返回False
q.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;
}

运行结果 

2
1
The queue is empty.

队列的好处 

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

结尾 

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

  • 93
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 54
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小芒果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值