例1:加密的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
思路:emmm...,加密QQ,利用两个队列,一个a存储加密过的数字,另一个b存储正确的QQ号,当b不等于空时,在while循环中,①先把a的头存入b;②把a的头删除掉;③把a的头放入a的尾;④删掉a的头元素#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> a, b;
int n,m;
cin>>n;
for (int i = 0; i < n; i++)
{//入队n个元素
cin>>m;
a.push(m);
}
while (!a.empty())
{//解密规则
b.push(a.front());
a.pop();
a.push(a.front());
a.pop();
}
while (!b.empty())
{//输出b队
cout << b.front()<<" ";
b.pop();
}
cout << endl;
return 0;
}
测试:
例2:判断回文字符串(栈)
🍊🍊所谓回文字符 串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“aha”和“ahaha”均是回 文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。
方法一:输入一个字符串,找出中间点,然后把中间点之前的元素全部压入栈中,后续用一个循环来跟后面的字符进行对比。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string str;
cin>>str;
stack<char> s;
int mid=str.size()/2-1;//得到中间那个数的下标
int next;
if(str.size()%2==0)
{//得到n为偶数时next的值
next=mid+1;
}
else
{//得到n为奇数时next的值
next=mid;
}
for(int i=0;i<=mid;i++)
{//入栈
s.push(str[i]);
}
for(int i=next;i<str.size();i++)
{//比较
if(s.top()==str[i])
{
s.pop();
}
else
{
break;
}
}
if(s.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
方法二:
主要思路是:将字符串依次压入栈中,利用栈的先进后出(可以将字符串逆转),依次读栈顶,并与字符串比较。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string a;
stack<char> s;
cin>>a;
int l=a.size();
for(int i=0;i<l;i++)
{
s.push(a[i]);
}
for(int i=0;i<l;i++)
{
if(s.top()==a[i])
{
s.pop();
}
else
{
cout<<"No";
break;
}
}
if(s.empty())
{
cout<<"Yes"<<endl;
}
return 0;
}
例3:判断回文字符串。(栈)
输入字符串,遇到"(“或者”[“就入栈,遇到”)“或者”]"就与栈顶的字符进行对比,若相等删除栈顶元素,不等则退出,如此循环。emmm,一定要记得加falg标志,如果直接用栈是否空来做结果判断会不够全面。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
string str;
stack<char> s;
cin>>str;
int l=str.size();
bool flag=true;//定义flag是为了标记失败的情况
for(int i=0;i<l;i++)
{
flag=true;
if(str[i]=='('||str[i]=='[')
{//将(和[压栈
s.push(str[i]);
}
else if(str[i]==')')
{
if(!s.empty() && '(' == s.top())
{//如果和栈顶元素为'('
s.pop();
}
else
{
flag=false;
break;
}
}
else if(str[i]==']')
{
if(!s.empty() && '['==s.top())
{
s.pop();
}
else
{
flag=false;
break;
}
}
}
if(s.empty()&& flag)
{//如果空 ,并且flsg为true.
cout<<"Yes"<<endl;
}
else
{//如果非空
cout<<"No"<<endl;
}
}
return 0;
}