洛谷中关于栈类型的题及题解(持续更新中)

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();
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值