现在的位置: 首页 > 综合 > 正文

表达式求值—-中缀式

2019年04月09日 ⁄ 综合 ⁄ 共 1928字 ⁄ 字号 评论关闭
#include <cstdio>
#include <stack>
#include <ctype.h>
using namespace std;

int operate(int a,char Optr,int b);
int cmp(char Optr1,char Optr2);
int Get_OP(stack<char> *s);
void push(stack<char> *s,int op);


int main()
{
	freopen("in.txt","r",stdin);
	stack<char> Opnd;
	stack<char> Optr;
	Optr.push('#');
    char ch;
	int OP1,OP2,OP3;
	while(1 == scanf("%c",&ch))
	{
        
		if(isdigit(ch))
			Opnd.push(ch);
		else	
		{
			if(-1 == cmp(Optr.top(),ch))
				Optr.push(ch);
			if(1 == cmp(Optr.top(),ch))
			{
				OP2 = Get_OP(&Opnd);
				OP1 = Get_OP(&Opnd);
				OP3 = operate(OP1,Optr.top(),OP2);
				printf("%c\n",Optr.top());
				Optr.pop();
				while(Optr.top() != '#')
				{
					if(1 == cmp(Optr.top(),ch))
					{
						OP2 = OP3;
						OP1 = Get_OP(&Opnd);
						OP3 = operate(OP1,Optr.top(),OP2);
						Optr.pop();
					}
					else if(0 == cmp(Optr.top(),ch))
					{
						printf("%c\n",Optr.top());
						Optr.pop();
						break;
					}
					else
						break;
				}
				if(ch != ')')
					Optr.push(ch);
				Opnd.push(',');
				push(&Opnd,OP3);
			}		
			if(ch != '#' && ch != '('&& ch != ')')
				Opnd.push(',');
			
		}
		
	}
	printf("%d\n",Get_OP(&Opnd));
	return 0;
}

int operate(int a,char Optr,int b)
{
    if(Optr == '+')
		return a+b;
	else if(Optr == '-')
		return a-b;
	else if(Optr == '*')
		return a*b;
	else
		return a/b;
}
int cmp(char Optr1,char Optr2)
{
    if(Optr1 == Optr2)
	{
		if(Optr1 == '#')
			return 0;
		if(Optr1 == '(')
			return -1;
		if(Optr1 == ')')
			return 1;
	}
	else
	{
		if(Optr1 == '+')
		{
			if(Optr2 == ')' || Optr2 == '-' || Optr2 == '#')
				return 1;
			else
				return -1;
		}
		if(Optr1 == '-')
		{
			if(Optr2 == ')' || Optr2 == '+' || Optr2 == '#')
				return 1;
			else
				return -1;
		}
		if(Optr1 == '*' || Optr1 == '/')
		{
			if(Optr2 == '(')
				return -1;
			else
				return 1;
		}
		if(Optr1 == '(')
		{
			if(Optr2 == ')')
				return 0;
			else
				return -1;
		}
		if(Optr1 == ')')
		{
			return 1;
		}
		if(Optr1 == '#')
		{
			return -1;
		}
	}
	return 2;
}

int Get_OP(stack<char> *s)
{
	char ss[8];
	int r,i;
	memset(ss,'0',8*sizeof(char));
	i = 7;
	while(!(*s).empty())
	{
		if((*s).top() == ',')
		{
			(*s).pop();
			break;
		}
		ss[i--] = (*s).top();
		(*s).pop();
		
	}
	if(ss[++i] == '-')
	{
		ss[i] = '0';
		sscanf(ss,"%d",&r);
		r = -1*r;
	}
	else
		sscanf(ss,"%d",&r);
	
	return r;
}

void push(stack<char> *s,int op)
{
	char buf[8];
	
	if(op<0)
	{
		op = -1*op;
		sprintf(buf,"%d",op);
		(*s).push('-');
		for(int j=0;j<strlen(buf);j++)
		{
			(*s).push(buf[j]);
		}
		
	}
	else
	{
		sprintf(buf,"%d",op);
		for(int j=0;j<strlen(buf);j++)
		{
			(*s).push(buf[j]);
		}
	}
}

具体思想参见 《数据结构C语言版--严蔚敏》直接贴代码:

抱歉!评论已关闭.