首页 > 其他分享 >7-2 栈实现表达式求值

7-2 栈实现表达式求值

时间:2023-11-23 20:55:10浏览次数:31  
标签:cnt ch return string 实现 int 求值 ss 表达式

#include<iostream>

#include<cstdio>

#include<string>

using namespace std;

const int N=100010;

string split(string s){

    string ss;

    for(int i=0;i<s.size();i++){

        if(s[i]==32) continue;

        ss+=char(s[i]);

    }

    return ss;

}

 

bool ck1(string s){

    int cnt=0;

    for(int i=0;i<s.size();i++){

        if(s[i]=='(') cnt++;

        else if(s[i]==')') cnt--;

    }

    return  cnt==0;

}

 

bool ck2(string s){

    for(int i=0;i<s.size();i++){

        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){

            if(i==0||i==s.size()-1||i&&(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/')){

                return 0;

            }

        }

    }

    return 1;

}

 

int pri(char ch){return ch=='*'||ch=='/'?2:1;}

char ch[N];

int cnt;

string cg(string s){

    string ss;

    for(int i=0;i<s.size();i++){

        if(s[i]>='0'&&s[i]<='9'){

            ss+=char(s[i]);

        }else{

            if(s[i]=='('){

                ch[cnt++]='(';

            }else if(s[i]==')'){

                while(ch[cnt-1]!='('){

                    ss+=ch[--cnt];

                }

                cnt--;

            }else{

                char c=char(s[i]);

                if(cnt>0&&pri(c)<=pri(ch[cnt-1])){

                    while(cnt>0&&ch[cnt-1]!='('&&pri(c)<=pri(ch[cnt-1])){

                        ss+=ch[--cnt];

                    }

                }

                ch[cnt++]=c;

            }

        }

    }

    while(cnt>0){

        ss+=ch[--cnt];

    }

    return ss;

}

 

int op(int x,int y,char ch){

    if(ch=='+') return x+y;

    else if(ch=='-') return x-y;

    else if(ch=='*') return x*y;

    else return x/y;

}

int a[N],ct;

int op(string s){

    for(int i=0;i<s.size();i++){

        if(s[i]>='0'&&s[i]<='9'){

            a[ct++]=s[i]-48;

        }

        else{

            int x=a[ct-2],y=a[ct-1];

            ct-=2;

            a[ct++]=op(x,y,char(s[i]));

        }

    }

    return a[0];

}

 

int main(){

    string s;

    getline(cin,s);

     

    s=split(s);

 

    if(!ck1(s)){

        cout<<"ERROR:缺少括号";

        return 0;

    }

     

    if(!ck2(s)){

        cout<<"ERROR:表达式缺操作数";

        return 0;

    }

     

    string ss=cg(s);

    cout<<ss<<endl;

     

    cout<<op(ss);

     

return 0;

 

}

标签:cnt,ch,return,string,实现,int,求值,ss,表达式
From: https://www.cnblogs.com/yuanxinglan/p/17852477.html

相关文章

  • 在vue2.0 项目中集成 Electron 实现桌面端应用
    需求:在桌面端有个应用能直接打开项目,不用在浏览器中浏览。方案:vue2.0+Electron关于vue的项目搭建和electron的相关介绍可以去官网了解,这里是直接在已经开发好的vue2.0的项目中直接加入electron。electron介绍:参考1: https://electronjs.p2hp.com/参考2:https://www.......
  • 刘金玉QT学习笔记:7-简易用户信息管理界面实现_实现用户信息增改
    1.同第六课方式在widget里连接并创建数据库。 2.通过QSqlQuery使用sql语句的第二种方法:-在不同的函数中都要使用->做成全局变量 3.表格网格控件tableview控件显示数据库的内容为表格行-ui拖出控件-qtableview控件通过QSqlQueryModel来渲染数据过程:1widget.h引入#i......
  • react开发 jest写单元测试 如何借助mock模拟实现接口返回文件流的下载测试
    要借助mock模拟实现接口返回文件流的下载测试,可以使用以下步骤:1.创建一个用于接收文件流的虚拟DOM元素,例如通过`document.createElement('a')`创建一个`<a>`元素。2.使用`URL.createObjectURL()`方法将文件流转换为URL。3.设置创建的虚拟DOM元素的`href`属性为URL,同时设置`dow......
  • GUI--JFrame学习02(实现加减法)
    实现代码packagegui;importjavax.swing.*;importjavax.swing.plaf.FontUIResource;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Enumeration;importjava.util.Random;publicclassTestGuiexte......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-s......
  • 低代码表单设计器:可视化+灵活+易操作,降本增效轻松实现!
    在现代化办公环境中,拥有先进的低代码表单设计器,可以让企业降本又增效,节约企业成本的同时,也能高效利用企业内部资源,为实现数字化转型升级提供夯实根基。那么,低代码表单设计器拥有什么样的特点?每种特点的优势表现在哪里?通过这篇文章,我们一起了解灵活、易操作、可视化的低代码表单设......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-scope=......
  • UE4_C++实现TimeLine
    主要实现蓝图节点中时间轴的功能。目前UE提供了两种实现方式,一个是使用FTimeLine其是一个时间轴的结构体;另一种方式是使用UTimeLineComponent,其是一个时间轴组件类。两者内部定义的函数基本一样,组件类中使用这个结构体变量作为类中的成员变量。声明一个时间轴变量/组件FTimeL......
  • MDns C# 实现 Makaretu.Dns.Multicast
     1、创建一个DNS服务:可以使用MulticastService类来创建一个DNS服务实例,并为其指定主机名和端口号。varservice=newMulticastService("mydns.local",IPAddress.Parse("224.0.0.251"),5353);2、添加DNS解析记录:可以使用ServiceAnnouncement类来添加DNS解析记录,并将其......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第十一周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第十一周学习笔记一、任务要求自学教材第13章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X......