码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-01 12:50:38      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

实现代码如下

#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!=‘\0‘)
	{
		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!=‘\0‘)
	{
		//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]=‘\0‘;//最后一个字符以\0结尾
	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!=‘\0‘)
	{
		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("表达式匹配失败\n");
		return -1;
	}
	char newexp[128];
	Transform(exp,newexp);
	cout<<"后缀表达式:"<<newexp<<endl;
	int re=Calculate(newexp);
	cout<<"运算结果为:"<<re<<endl;
	return 0;
}

  

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

标签:

原文地址:http://www.cnblogs.com/jueshi0208/p/5549150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!