【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