• 使用栈来计算后缀表达式


    后缀表达式

    我们平时写的都是中缀表达式,也就是将运算符写在2个操作数中间
    而后缀表达式 则是将运算符写在2个操作数后面
    例如:

     (a+b)*c-(a+b)/e 的后缀表达式为:ab+c*ab+e/-
    

    计算思路

    从左到右扫描输入串(string数组):
    1、若当前字符为数字(操作数),则将其放入栈
    2、若当前字符为运算符,则依次取出栈顶的2个数,进行对应的运算,并将运算结果放入栈
    3、指针读取下一个字符,回到第1步


    当遍历完数组后,栈中的唯一一个元素即为计算结果

    代码实现(C++)

    假设输入的字符串是一个 string类的数组
    全局定义栈的相关变量和方法

    const int N=100; //定义栈的最大容量
    string data[N]; //使用数组表示栈
    int top=-1; //指向栈顶元素下标
    
    //判断栈是否为空 
    bool isEmpty(){
          return top==-1 ? true : false;
    }
    
    //入栈 
    void Push(string ele){
    	if(top>=N-1){
    		cout<<"栈已满,无法插入"<<endl;
    		return;
    	}
    	
    	data[top+1]=ele;
    	top++;
    	return;
    }
    
    //出栈 
    string Pop(){
    	if(isEmpty()==true){
    		cout<<"栈已空,无法出栈"<<endl;
    		return "!";
    	}
    	
    	string topEle=data[top];
    	data[top]="null";
    	top--;
    	return topEle;
    }
    

    除此之外,我们需要一个判断当前字符是否为数字的函数(利用ASCII码判别)

    bool isDigit(string v){
    	if(int(v[0])<=57&&int(v[0])>=48){
    		return true;
    	}else{
    		return false;
    	}
    }
    

    用于计算表达式结果的函数

    //传入string数组以及数组长度
    void calculate(string input[],int len){
        
    	for(int i=0;i<len;i++){
    		
    		if(isDigit(input[i])==true){
    			Push(input[i]);
    		}else{
                // 将取出的栈顶元素转换成int
    			int v2=stoi(Pop());
    			int v1=stoi(Pop());
    			
    			if(input[i]=="+"){
    				Push(to_string(v1+v2));
    			}else if(input[i]=="-"){
    				Push(to_string(v1-v2));
    			}else if(input[i]=="*"){
    				Push(to_string(v1*v2));
    			}
    			else if(input[i]=="/"){
    				Push(to_string(v1/v2));
    			}else{
    				cout<<"ERROR"<<endl;
    			}
    		}
    	}
    	
    	cout<<data[0]<<endl;
    	return;
    }
    

    参考样例:
    string input[]={"6","2","/","3","-","4","2","*","+"};
    计算结果为:8

  • 相关阅读:
    [Chrome_OS]Crosh Shell终端 基础命令
    [HTML5_WebSockets]HTML 5 Web Sockets应用初探
    [HTML5_WebWorkers]利用HTML5的window.postMessage实现跨域通信
    [HTML5_资源]49个超炫的HTML 5示例
    [HTML5_资源]国外模版网站
    [HTML5_JS跨域]JavaScript跨域总结与解决办法
    [HTML5_资源]给网页设计师的30个HTML5学习资源
    [HTML5_WebWorkers]HTML5 web通信(跨文档通信/通道通信)简介
    [HTML5_JQueryMobile]20个很棒的 jQuery Mobile 教程
    LeetCode-513. Find Bottom Left Tree Value
  • 原文地址:https://www.cnblogs.com/baebae996/p/13813824.html
Copyright © 2020-2023  润新知