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

栈实现表达式求值

时间:2022-12-23 21:13:38浏览次数:35  
标签:输出 ch return 实现 int && 求值 表达式

使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。

输入格式:

输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERROR:缺少括号"。输入两个除括号外运算符连续的表达式,输出"ERROR:表达式缺操作数"。

输出格式:

请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

代码如下:

#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;
}

 

标签:输出,ch,return,实现,int,&&,求值,表达式
From: https://www.cnblogs.com/psh888/p/17001630.html

相关文章

  • 邻接表存储实现图的深度优先遍历
    编写程序,实现由邻接表存储实现无向图的深度优先搜索遍历的功能。顶点为字符型。输入格式:第一行输入顶点个数及边的个数,第二行依次输入各顶点,第三行开始依次输入边的两个......
  • 迪杰斯特拉方法实现最短路径
    用迪杰斯特拉算法实现有向网的最短路径输入格式:第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的两个点的及边上的权值,用空格间隔。......
  • C语言实现通讯录
    前言通讯录的实现综合了C语言的不少基本语法、编程思想和好的编程习惯,深入理解此项目的实现有助于提高语言的实际应用能力。这个通讯录可以保存联系人的姓名、年龄、性别、......
  • 树莓派利用摄像头实现web在线监控
    1、https://shumeipai.nxez.com/2021/10/21/raspberry-pi-usb-camera-to-realize-remote-network-monitoring.html2、上个链接执行到第六步时,可以采用下面的方法:2.1若使......
  • 通过地址和索引实现数组
    CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。数组是指同样长度的数据在内存中进行连续排列的......
  • C语言实现udp
    #include<stdio.h>#include<strings.h>#include"arpa/inet.h"typedefunionstd{unsignedshorta;unsignedcharb[2];}STD;voidudp_server(){......
  • 教你用JavaScript实现进度条
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条。进度条数字自动增加,条状图片动画演示进度完成度。通过实......
  • 教你用JavaScript实现进度条
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条。进度条数字自动增加,条状图片动画演示进度完成度。通过......
  • EL表达式
    EL表达式El表达式是什么?ExpressionLanguage(表达式语言)EL表达式归属于JSP为什么要有EL表达式?EL表达式可以代替JSP中的java代码,让jsp文件中的程序更加整洁美观......
  • SpreadJS集算表联动数据透视表,高效实现前端数据多维分析
    在做一些财务、供应链、资产管理等系统时,由于业务人员线下都是采用Excel来完成的,因此就需要将Excel中业务人员使用的功能都能在Web端系统实现,整体上的实现方案有三种:完全......