首页 > 其他分享 >栈练习题

栈练习题

时间:2023-12-27 18:38:31浏览次数:31  
标签:练习题 case return int top st 表达式

单调栈(洛谷P5788)


题目大意

中的向右看齐相同


题解

未知的代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+5;
int a[N],ans[N],n;
stack<int>s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=n;i>=1;i--){
        while(!s.empty()&&a[s.top()]<=a[i])s.pop();
        if(s.empty())ans[i]=0;
        else ans[i]=s.top();
        s.push(i);
    }
    for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
    return 0;
}

后缀表达式(洛谷P1449)


题目大意

计算后缀表达式的值


解题思路

利用栈计算后缀表达式

未知的代码
#include<bits/stdc++.h>
using namespace std;
string s;
stack<string>st;
int main(){
	getline(cin,s);
	int p=0;
	while(s[p]!='@'){
		string tmp;
		while(s[p]!='.'&&isdigit(s[p]))tmp+=s[p++];
		if(s[p]!='.'){
			int a=stoi(st.top());st.pop();
			int b=stoi(st.top());st.pop();
			switch(s[p]){
				case '+':st.push(to_string(b+a));break;
				case '-':st.push(to_string(b-a));break;
				case '*':st.push(to_string(b*a));break;
				case '/':st.push(to_string(b/a));break;
			}
		}
		else st.push(tmp);
		p++;
	}
	cout<<st.top();
	return 0;
}

表达式括号匹配(洛谷P1739)


题目大意

判断表达式括号是否匹配。


解题思路

利用栈存入括号,当遇到右括号时出栈匹配是否为左括号。

未知的代码
#include<bits/stdc++.h>
using namespace std;
string s;
stack<char>st;
int main(){
	getline(cin,s);
	for(auto&ch:s){
		if(ch=='(')st.push(ch);
		else if(ch==')'){
			if(!st.empty()&&st.top()=='(')st.pop();
			else{
				puts("NO");
				return 0;
			}
		}
	}
	if(st.empty())puts("YES");
	else puts("NO");
	return 0;
}

表达式求值(P1981)


题目大意

对一个字符串算数表达式计算求值。表达式只有加法和乘法,不含括号。


解题思路

先将所有乘法计算出来,转化为只有加法,最后相加求解。

未知的代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e4;
stack<int>s;
int main(){
	int a,b;
	char op;
	cin>>a;
	s.push(a%mod);
	while(cin>>op>>b){
		if(op=='+')s.push(b);
		else{
			a=s.top();
			s.pop();
			s.push(a*b%mod);
		}
	}
	a=0;
	while(!s.empty()){
		a+=s.top();
		s.pop();
	}
	cout<<a%mod<<endl;
	return 0;
}

表达式的转换(P1175)


题目大意

给定中缀表达式,输出转化后缀表达式后的每一次运算操作后的后缀表达式。


解题思路

先将中缀表达式转为后缀表达式,需要考虑运算符优先级,然后按优先级顺序和先后顺序依次计算并输出。对于给定的中缀表达式字符串s,遍历每个字符,根据字符的类型进行相应的操作:如果是数字,则直接添加到结果字符串;如果是'(',则将其压入栈中;如果是')',则将栈顶元素弹出并添加到结果字符串,直到遇到'(',然后将'('从栈中弹出;如果是运算符,则比较其与栈顶运算符的优先级,如果栈顶运算符优先级高于等于当前运算符,则将栈顶元素弹出并添加到结果字符串,直到栈为空或栈顶运算符优先级低于当前运算符,然后将当前运算符压入栈中。最后,将栈中剩余的运算符依次弹出并添加到结果字符串。

未知的代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	auto priority=[&](char c){
		switch(c){
			case '+':
			case '-':return 1;
			case '*':
			case '/':return 2;
			case '^':return 3;
			case '(':
			case ')':return 0;
			default:return -1;
		}
	};
	auto to_suffix=[&](string&s){
		string ans;
		stack<char>st;
		for(auto&it:s){
			if(isdigit(it))ans+=it;
			else if(it=='(')st.push(it);
			else if(it==')'){
				while(!st.empty()&&st.top()!='('){
					ans+=st.top();
					st.pop();
				}
				if(!st.empty())st.pop();
			}else{
				while(!st.empty()&&priority(st.top())>=priority(it)){
					if(priority(st.top())==priority(it)&&it=='^')break;
					ans+=st.top();
					st.pop();
				}
				st.push(it);
			}
		}
		while(!st.empty()){
			ans+=st.top();
			st.pop();
		}
		return ans;
	};
	auto calc_part=[&](int a,int b,char op){
		switch(op){
			case '+': return a+b;
			case '-': return a-b;
			case '*': return a*b;
			case '/': return a/b;
			case '^': return (int)pow(a,b);
			default: return -1;
		}
	};
	auto calc=[&](string s){
		vector<int>l;
		for(auto&it:s)cout<<it<<' ';
		cout<<endl;
		for(auto it=s.begin();it!=s.end();it++){
			if(isdigit(*it))l.push_back(*it-'0');
			else{
				int a=l.back();
				l.pop_back();
				int b=l.back();
				l.pop_back();
				l.push_back(calc_part(b,a,*it));
				for(auto&v:l)cout<<v<<' ';
				for(auto jt=it+1;jt!=s.end();jt++)cout<<*jt<<" ";
				cout<<endl;
			}
		}
	};
	calc(to_suffix(s));
	return 0;
}

标签:练习题,case,return,int,top,st,表达式
From: https://www.cnblogs.com/eternal-world/p/17930334.html

相关文章

  • Java多线程​(五)练习题7道
    练习多线程练习1(卖电影票)一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒,要求:请用多线程模拟卖票过程并打印剩余电影票的数量线程类实现:publicclassTicketWindowextendsThread{publicTicketWindow(){}publicTicketWindow(Stringname){super(nam......
  • c203数据库练习题下半
    2、视图练习(1)建立视图v_xs_1,要求包含男生的学号,姓名,性别,出生日期,班级编号,专业名称字段,并要求视图操作数据时进行检查。使用select命令查询创建的视图。createviewv_xs_1asselectxh,xm,xb,csrq,bjbh,zymcfromxsjbxxbwherexb='男'withcheckoption;建立一个学院教师......
  • c203数据库练习题上半
    1.使用SQL语言创建满足以下要求的数据库。(1)创建数据库名称为jwgl,字符集选择utf8,排序规则选择utf8_general_ci。createdatabasejwglcharactersetutf8collateutf8_general_ci;(2)查看数据库。showdatabases;(3)将数据库jwgl的指定字符集修改为gb2312。mysql>alterdatabasejwg......
  • 倍增基础练习题
    syoj806.序列翻转P6148[USACO20FEB]SwapitySwapitySwapS\(n\)个进行\(m\)次操作,每次操作将所给的\(l\)到\(r\)区间进行翻转。一共会重复\(k\)次上述操作。\(k<=1e9\)。倍增\(k\),设\(f[i][j]\)表示总操作重复\(2^i\)次后的序列。预处理时,转移方程为\(f[......
  • 十、练习题
    练习题......
  • PTA-2023第十三次练习题目题解
    PTA-2023第十三次练习题目题解以下代码已做防抄袭处理,切勿抄袭。注意:手机端因为屏幕限制,代码会有(不希望的)换行。解决方案:1.建议使用电脑端打开。2.点击代码进入全屏观看。6-25实验9_5_反向打印字符串思路就是每次先找到字符串的最后一位,然后输出这一位,输出之后将这一位改为‘......
  • C练习题——打印两个数的最大公约数
    算法一:暴力求解(效率不够)#include<stdio.h>intmain(){inta=0;intb=0;scanf("%d%d",&a,&b);intmin=a<b?a:b;while(1){if((a%min==0)&&(b%min==0))break;......
  • C练习题——打印第n个斐波那契数
    斐波那契数列:1123581321...规律:从第三个数开始,第n个数为前两数之和#include<stdio.h>intmain(){intn=0;scanf("%d",&n);inta=1;intb=1;intc=1;while(n>=3){c=a+b;a=b;......
  • PTA-2023第十二次练习题目题解
    PTA-2023第十二次练习题目题解(祝大家机考顺利)以下代码已做防抄袭处理,切勿抄袭。注意:手机端因为屏幕限制,代码会有(不希望的)换行。解决方案:1.建议使用电脑端打开。2.点击代码进入全屏观看。6-24实验8_3_设计函数利用冒泡排序的思想,将每一列的最小值放到每列的最后一个位置。voi......
  • PTA-2023第十一次练习题目讲解
    PTA-2023第十一次练习题目6-17实验7_9_简单排序法一:冒泡排序上课学过好多好多次,讲解略过,代码有注释。voidbubbleSort(intdata[],intelementCount){for(inti=0;i<elementCount-1;i++)//第一层循环,控制找最大值的次数{for(intj=0;j<elementCount-......