【STL】栈+队列

【STL】stack+queue

一、定义
栈:栈是一种特殊的后进先出线性表,只能在表尾进行插入和删除,表尾端为栈顶(top),表头端为栈底(bottom)。

队列:与栈相反,是一种先进先出的线性表,它只允许在表的一段进行插入,在另一端删除元素,和日常生活中的排队是一致的,允许插入的一端是对位,允许喊出的一端是队头。

二、栈和队列的特点

栈: 后进先出

在这里插入图片描述
队列:先进先出
在这里插入图片描述

三、栈和队列的使用

1、头文件声明:

 #include<queue>// 队列
 #include<stack>//栈

2、定义:

stack<int>  s;//栈
queue<int>  q; //队列

3、常用的操作:
1)、栈:

s.empty()     //判断栈是否为空,如果栈为空返回true,否则返回false  
s.size()     //返回栈中元素的数目
s.pop()     //删除栈顶元素
s.top()     //取出栈顶元素
s.push()     //在栈顶压入新元素

2)、队列

q.empty()   // 判断队列是否为空,空返回true,否则返回false  
q.size()    // 返回队列中元素个数  
q.pop()     //删除队头
q.front()     // 返回队头元素
q.push(X)    //新元素入队,在队尾压入
q.back()     //返回最后一个元素

四、栈和队列的应用

1、栈:判断回文字符串

#include<iostream>
#include<stack>
#include<string>
using namespace std;
 
int main()
{
	string str;		//定义一个字符串
	stack<char> a;		//新建一个栈a
	cin >> str;
	int mid=str.size()/2-1; //下标从0开始,所以减1 
	int next;
	for(int i=0;i<=mid;i++)
		a.push(str.at(i));
	if(str.size()%2==0) 
		next=mid+1;
	else
		next=mid+2;
	for(int i=next;i<str.size();i++)  //判断mid后的字符串是否与前面的相同
	{
		if(str.at(i)==a.top())
			a.pop();
		else 
			break;
	}
	if(a.empty())
		cout << "yes\n";
	else
		cout << "no\n";
	return 0;
 } 

在这里插入图片描述

2、队列

加密的QQ
新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ号, 小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密过的数字,同时 小哈也告诉了小哼解密规则。规则是这样的:首先将第 1个数删除,紧接着将第 2个数放到 这串数的末尾,再将第 3个数删除并将第 4个数放到这串数的末尾,再将第 5个数删除…… 直到剩下后一个数,将后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一 起就是小哈的 QQ啦。现在你来帮帮小哼吧。

样例输入:

9

6 3 1 7 5 8 9 2 4

样例输出:

6 1 5 9 4 7 2 8 3
#include<iostream>
#include<queue>
 
using namespace std;
 
int main()
{
	queue<int> a,b;   //定义两个队列容器,a存放输入的数,b存放正确的qq
	int n,m;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&m);
		a.push(m);
	}
	while(!a.empty())
	{
		b.push(a.front());    //把a的头存入b
		a.pop();          //删掉a的头
		a.push(a.front());       //把a的头放在a的尾部
		a.pop();         //删掉a的头
	}
	while(!b.empty())
	{
		cout << b.front() << " ";
		b.pop();
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

题解原文:https://blog.csdn.net/lesileqin/article/details/85058354

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值