P1427 小鱼的数字游戏
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a i(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入格式
一行内输入一串整数,以 00 结束,以空格间隔。
输出格式
一行内倒着输出这一串整数,以空格间隔。
输入输出样例
输入
3 65 23 5 34 1 30 0
输出
30 1 34 5 23 65 3
程序源代码
#include<bits/stdc++.h>
using namespace std;
stack<int> stc;
int main()
{
int x;
while(cin>>x&&x)
{
stc.push(x);
}
while(!stc.empty())
{
cout<<stc.top()<<' ';
stc.pop();
}
}
P1739 表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入格式
一行:表达式
输出格式
一行:“YES” 或“NO”
输入输出样例
输入 #1复制
2*(x+y)/(1-x)@
输出 #1复制
YES
输入 #2复制
(25+x)(a(a+b+b)@
输出 #2复制
NO
说明/提示
表达式长度小于255,左圆括号少于20个
程序源代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
stack<char> sta;
string::iterator it;//字符串中使用的迭代器
for(it = s.begin();it != s.end();it++)
{
if(*it=='(') sta.push('(');
else if(*it==')')
{
if(sta.empty())
{
cout<<"NO"<<endl;
return 0;
}
else{
sta.pop();
}
}
}
if(sta.empty())
{
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}
P5788 【模板】单调栈
题目描述
给出项数为 n 的整数数列 a1…n 。
给出项数为 nn 的整数数列 a_{1 \dots n}a
1…n
。
定义函数 f(i)f(i) 代表数列中第 ii 个元素之后第一个大于 ai的元素的下标,即f(i)=min
i<j≤n,aj>ai{j}。若不存在,则 f(i)=0f(i)=0。试求出 f(1…n)。
输入格式
第一行一个正整数 n。
第二行 n个正整数a1…n。
输出格式
一行 n 个整数 f(1…n) 的值。
输入输出样例
输入 #1复制
5
1 4 2 3 5
输出 #1复制
2 5 4 5 0
说明/提示【数据规模与约定】
对于 30% 的数据n≤100;
对于 60% 的数据,10^3n≤5×10 ^3;
对于100% 的数据,1≤n≤3^6,1≤a i ≤10 ^9 。
#include <bits/stdc++.h>
using namespace std;
const int N=3e6+7;
int main()
{
stack<int> sta;
stack<int> ans;
int n;
int a[N];
scanf("%d",&n);
for(int i=1;i<=n;i++) //放入栈中
{
scanf("%d",&a[i]);
}
for(int i=n;i>=1;i--)
{
while(!sta.empty()&&a[sta.top()]<=a[i])
{
sta.pop();//非空,a[sta.pop]<a[i],删除;
}
if(sta.empty()) ans.push(0); //若空,ans添加0,若上一步之后为空,也加0;
else ans.push(sta.top()); //不空,加上一个
sta.push(i);
}
while(!ans.empty())
{
cout<<ans.top()<<' ';
ans.pop();
}
}