06.栈习题

1353:表达式括号匹配(stack)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

算法思想:

1.用string存储字符串,遍历字符串

2.遇到左括号就入栈

3.遇到右括号就匹配出栈,但是再出栈之前要判断栈是否为空

a.如果栈为空,说明没有与右括号匹配的左括号,右括号多了,不匹配!!

b.否则,说明左括号与右括号匹配上了,将左括号出栈

4.循环结束之后,判断栈是否为空

a.如果栈为空,说明左括号与右括号完全匹配上了

b.否则,说明左括号多了,不匹配!!!

#include <iostream>
#include <stack>
using namespace std;

int main() {
    string s;
    stack<char> stk;
    getline(cin,s);
    for(auto c:s){//遍历字符串
        if(c=='('){//遇到左括号入栈
            stk.push(c);
        }else if(c==')'){//遇到右括号,先判断栈是否为空
            if(!stk.empty()){//如果不为空,则左括号与右括号匹配要出栈
                stk.pop();
            }else{//如果为空,说明已经没有与左括号匹配的右括号了,输出NO
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }
    //遍历完之后,如果栈里面还有左括号说明不匹配
    if(!stk.empty()) cout<<"NO"<<endl;
    else             cout<<"YES"<<endl;
    return 0;
}

P1981 [NOIP2013 普及组] 中缀表达式求值

算法思想:

1.如果在1前面加个括号的话,就符合一个运算符一个数组的模式

2.遇到+后面数组就入栈

3.遇到*栈顶元素就计算

4.最后循环出栈,计算sum和

本题要保留后4为,必须边计算边求余,利用模运算的性质

#include <iostream>
 #include <stack>
 using namespace std;
 const int M = 1e4;
 int main() {
    stack<int> stk;
    char ch;
    int num, sum = 0;
    cin >> num;
    stk.push(num % M);
    while (cin >> ch >> num) {//一个字符一个数字的输入规律,开始循环
		if (ch == '+')//遇到+就入栈
		stk.push(num % M);
 		else if (ch == '*') {//遇到*就计算
		stk.top() = (stk.top() % M * num % M) % M;
 		}
 	}
 	while (!stk.empty()) {//最后栈里面的累加求和
	sum = (sum % M + stk.top() % M) % M;
 	stk.pop();
 }
 cout << sum << endl;
 return 0;

1354:括弧匹配检验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

算法思想:遇到左类型的括号就入栈,遇到右类型的括号就要出栈,但是出栈前要判断是否栈空和是否匹配,与1353类似省略

#include <iostream>
#include <stack>
#include <string>
using namespace std;
string s;
int main() {
    stack<char> stk;
    cin>>s;
    for(auto c:s){
        if(c=='['||c=='(')
            stk.push(c);
        else if(c==']'){
            if(stk.empty()){
                cout<<"Wrong"<<endl;
                return 0;
            }
            else{
                if(stk.top()=='[') stk.pop();
                else{
                    cout<<"Wrong"<<endl;
                    return 0;
                }
            }
        }
        else if(c==')'){
            if(stk.empty()){
                cout<<"Wrong"<<endl;
                return 0;
            }
            else{
                if(stk.top()=='(') stk.pop();
                else{
                    cout<<"Wrong"<<endl;
                    return 0;
                }
            }
        }
    }
    if(!stk.empty()) cout<<"Wrong"<<endl;
    else             cout<<"OK"<<endl;
    return 0;
}

1358中缀表达式值(expr)

#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
    stack<int> stk;
    char ch='+';
    int num,sum=0;cin>>num;
    stk.push(num);
    while(cin>>ch>>num){
        if(ch=='@') break;
        if(ch=='+') stk.push(num);
        else if(ch=='-') stk.push(-num);
        else if(ch=='*') stk.top()*=num;
        else if(ch=='/') stk.top()/=num;
    }
    while(!stk.empty()){
        sum+=stk.top();
        stk.pop();
    }
    cout<<sum<<endl;
    return 0;
}

1355:字符串匹配问题(strs)优先级问题

#include<iostream>
#include<map>
#include<stack>
using namespace std;
map<char,int> mp;
void check(string s){
    stack<char> stk;
    for(int i=0;i<s.size();i++){
        if(mp[s[i]]>0){
            if(stk.empty()) stk.push(s[i]);
            else{
                if(mp[stk.top()]>=mp[s[i]]){
                    stk.push(s[i]);
                }
                else{
                    cout<<"NO"<<endl;
                    return ;
                }
            }
        }
        else{
            if(stk.empty()){
                cout<<"NO"<<endl;
                return ;
            }
            else if(mp[stk.top()]+mp[s[i]]==0){
                stk.pop();
            }
            else if(mp[stk.top()]+mp[s[i]]!=0){
                cout<<"NO"<<endl;
                return ;
            }
        }
    }
    if(!stk.empty()) cout<<"NO"<<endl;
    else             cout<<"YES"<<endl;
}

int main(){
    int n;cin>>n;
    //把所有左 右 括号都用map映射一下
    mp['<']=1;mp['(']=2;mp['[']=3;mp['{']=4;
    mp['>']=-1;mp[')']=-2;mp[']']=-3;mp['}']=-4;
    while(n--){
        string s;cin>>s;
        check(s);
    }
    return 0;
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值