• 中缀表达式检测并转换后缀表达式,计算后缀表达式的结果


    实现代码如下

    #include <iostream>
    #include <stack>
    #include <ctype.h>
    using namespace std;
    //这里的数字只能是一位
    //扫描表达式是否合法,合法返回0,否则返回非0
    int Scanner(const char *str)
    {
    	stack<char*> s;
    	if(str==NULL)
    	{
    		return -1;
    	}
    	char *p=(char*)str;
    	while(*p!='')
    	{
    		if(*p=='(')//如果是左括号就入栈
    		{
    			s.push(p);
    		}
    		else if(*p==')')//右括号就获得栈顶符号,并匹配
    		{
    			if(!s.empty())//栈不为空
    			{
    				char *t=s.top();//拿到栈顶元素进行匹配
    				if(*t=='(')//匹配
    				{
    					s.pop();
    				}
    			}
    		}
    		p++;
    	}
    	if(!s.empty())//最后栈为空匹配失败
    	{
    		return -1;
    	}
    	return 0;
    }
    //返回运算符号的优先级
    int GetPriority(char ch)
    {
    	if(ch=='+'||ch=='-')
    	{
    		return 1;
    	}
    	else if(ch=='*'||ch== '/')
    	{
    		return 2;
    	}
    	else
    	{
    		return 0;
    	}
    }
    //中缀表达式转换为后缀表达式
    int Transform(/*in*/char *src,/*out*/char *dest)
    {
    	stack<char*> s;
    	int i=0;
    	if(src==NULL||dest==NULL)
    	{
    		return -1;
    	}
    	char *psrc=src;
    	while(*psrc!='')
    	{
    		//if(*psrc>='0'&& *psrc<='9')//如果是数字
    		if(isdigit(*psrc))//如果字符是数字时
    		{
    			dest[i]=*psrc;
    			i++;
    		}
    		else if(*psrc=='(')//如果是左括号就进栈
    		{
    			s.push(psrc);
    		}
    		else if(*psrc==')')//如果是右括号,弹出栈顶元素
    		{
    			while(!s.empty()&&(*s.top())!='(')
    			{
    				dest[i]=*s.top();
    				i++;
    				s.pop();
    			}
    			s.pop();//弹出左括号
    		}
    		else if((*psrc=='+')||(*psrc=='-')||(*psrc=='*')||(*psrc=='/'))//如果是运算符
    		{
    			while(!s.empty()&&GetPriority(*s.top())>=GetPriority(*psrc))//比较运算符优先级
    			{//若栈顶符号优先级不低
    				dest[i]=*s.top();
    				i++;
    				s.pop();
    			}
    			s.push(psrc);//栈顶符号优先级低
    		}
    		else
    		{
    			cout<<"表达式中有非法字符"<<endl;
    			return -1;
    		}
    		psrc++;
    	}
    	while(!s.empty())
    	{
    		dest[i]=*s.top();
    		i++;
    		s.pop();
    	}
    	dest[i]='';//最后一个字符以结尾
    	return 0;
    }
    //运算法则
    int Arithmetic(int left,int right,char c)
    {
    	switch(c)
    	{
    	case '+':
    		return left+right;
    	case '-':
    		return left-right;
    	case '*':
    		return left*right;
    	case '/':
    		if(right==0)
    		{
    			return 0;
    		}
    		else
    		{
    			return left/right;
    		}
    	default:
    		return 0;
    	}
    }
    //计算后缀表达式的运算结果
    //说明此接口将结果返回,不怎么好,可以将结果传出,使用一级指针
    //int calculate(char *str,int* out)
    int Calculate(char *src)
    {
    	if(src==NULL)
    	{
    		return -1;
    	}
    	stack<int> s;//栈中放入int
    	char* psrc=src; 
    	int result=0;//表达式计算的结果
    	while(*psrc!='')
    	{
    		if(isdigit(*psrc))//如果字符是数字时
    		{
    			s.push(*psrc-'0');//将数字符号转化为int压入栈中
    		}
    		else if((*psrc=='+')||(*psrc=='-')||(*psrc=='*')||(*psrc=='/'))//如果是符号
    		{
    			int right=s.top();//拿到左操作数,并弹出
    			s.pop();
    			int left=s.top();//拿到右操作数,并弹出
    			s.pop();
    			int re=Arithmetic(left,right,*psrc);
    			s.push(re);//将运算结果压入栈中
    		}
    		else
    		{
    			cout<<"表达式中有非法字符"<<endl;
    			return -1;
    		}
    		psrc++;
    	}
    	if(s.size()==1)//栈中只有一个结果时,就是最终运算结果
    	{
    		result=s.top();
    		return result;
    		//s.pop();
    	}
    	else
    	{
    		cout<<"运算结果不正确"<<endl;
    		return -1;
    	}
    	return result;
    }
    int main()
    {
    	char *exp="(2+4)*3-9";
    	cout<<"中缀表达式:"<<exp<<endl;
    	if(Scanner(exp)!=0)
    	{
    		printf("表达式匹配失败
    ");
    		return -1;
    	}
    	char newexp[128];
    	Transform(exp,newexp);
    	cout<<"后缀表达式:"<<newexp<<endl;
    	int re=Calculate(newexp);
    	cout<<"运算结果为:"<<re<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    Synchronized锁升级
    锁削除和锁粗化
    自旋锁
    Synchronized原理
    浅谈AQS原理
    JSON使用
    JSON语法
    Decode Ways
    String to Integer(atoi)
    Leetcode:Reverse Words in a String
  • 原文地址:https://www.cnblogs.com/jueshi0208/p/5549150.html
Copyright © 2020-2023  润新知