中缀表达式直接求值

基本思想:设两个栈,一个保存操作数,一个保存操作符,其他操作优先级和细节问题与后缀表达式基本相同

程序代码:

                          

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct 
{//创建操作数栈
	int data[MAX];
	int top;
}SeqStack,*PSeqStack;
typedef struct
{//创建操作符栈
	char data[MAX];
	int top;
}SeqStack1,*PSeqStack1;
//创建一个空栈
PSeqStack Init_Seqstack()
{
	PSeqStack S;
	S=(PSeqStack )malloc(sizeof(SeqStack));
	if(S )
		S->top=-1;
	return S;
}
PSeqStack1 Init_Seqstack1()
{
	PSeqStack1 S;
	S=(PSeqStack1 )malloc(sizeof(SeqStack1));
	if(S )
		S->top=-1;
	return S;
}
//判断栈是否为空
int Empty_Seqstack(PSeqStack S)
{
	if(S->top==-1)
		 return 1;
	else
		return 0;
}
int Empty_Seqstack1(PSeqStack1 S)
{
	if(S->top==-1)
		 return 1;
	else
		return 0;
}
//压栈
int Push_Seqstack(PSeqStack S,int x)
{
	if(S->top==MAX-1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top]=x;
		return 1;
	}
}
int Push_Seqstack1(PSeqStack1 S,char x)
{
	if(S->top==MAX-1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top]=x;
		return 1;
	}
}
//删除栈顶元素
int Pop_Seqstack(PSeqStack S,int *x)
{
	if(Empty_Seqstack(S))
		return 0;
	else
	{
		*x=S->data[S->top];
		S->top--;
		return 1;
	}
}
int Pop_Seqstack1(PSeqStack1 S,char *x)
{
	if(Empty_Seqstack1(S))
		return 0;
	else
	{
		*x=S->data[S->top];
		S->top--;
		return 1;
	}
}
//得到栈顶元素
int Gettop_Seqstack(PSeqStack S,int *x)
{
	if(Empty_Seqstack(S))
		return 0;
	else
		*x=S->data[S->top];
	return 1;
}
int Gettop_Seqstack1(PSeqStack1 S,char *x)
{
	if(Empty_Seqstack1(S))
		return 0;
	else
		*x=S->data[S->top];
	return 1;
}
//删除栈
void Destroy_seqstack(PSeqStack *S)
{
	if(*S)
		free(*S);
	*S=NULL;
	return ;	
}
void Destroy_seqstack1(PSeqStack1 *S)
{
	if(*S)
		free(*S);
	*S=NULL;
	return ;	
}
int isNUM(char ch)
{//判断是否是字符
	if(ch>='0'&&ch<='9')
		return 1;
	else
		return 0;
}
int isop(char op)//判断是否为操作符的方法
{
    switch(op)
    {
    case '+':
    case '-':
    case '*':
    case '/':    return 1;//如果是操作符则返回数值1
    default :   return 0;//其他为返回数值0,代表假

    }
}
int YouXianJi(char op)//判断字符的优先级方法
{
    switch(op)
    {
    case '=':return -1;//将=入栈为判断结束标记
    case '(':return 0;
    case '*':
    case '/':return 2;//乘除的优先级高
    case '+':
    case '-':return 1;
    default :return -1;
    }
}

int jisuan(char a[])
{
	int i=0;
	int e;
	int x1,x2,c;//接受数据栈的值
	char e1;
	PSeqStack num;//
	PSeqStack1 op;//
	num=Init_Seqstack();
	op=Init_Seqstack1();
	Push_Seqstack1(op,'=');//用来判断操作符结束
    while(a[i]!='=')
	{
		if(isNUM(a[i]))
		{//是数字的话,直接入数字栈中
			Push_Seqstack(num,a[i]-'0');
			i++;
		}
		else if(a[i]=='(')
		{//如果是的话,直接入栈,无需比较
			Push_Seqstack1(op,a[i]);
			i++;
		}
		else if(a[i]==')')
		{//如果遇到),则一直出栈计算,直到遇到(
			while(Gettop_Seqstack1(op,&e1)!='(')//
			{
				switch(Pop_Seqstack1(op,&e1),e1)
				{
				case '+':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1+x2;
						 Push_Seqstack(num,c);
						 break;
				case '-':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1-x2;
						 Push_Seqstack(num,c);
						 break;
				case '*':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1*x2;
						 Push_Seqstack(num,c);
						 break;
				case '/':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1/x2;
						 Push_Seqstack(num,c);
						 break;
				default:break;
				}
			}
			Pop_Seqstack1(op,&e1);//
			i++;
		}
		else if(isop(a[i]))//是否是操作符
		{
			while(YouXianJi(a[i])<=YouXianJi(Gettop_Seqstack1(op,&e1)))//如果当前的操作符小于栈顶,则出栈计算
			{
				switch(Pop_Seqstack1(op,&e1),e1)
				{
					case '+':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1+x2;
						 Push_Seqstack(num,c);
						 break;
				case '-':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1-x2;
						 Push_Seqstack(num,c);
						 break;
				case '*':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1*x2;
						 Push_Seqstack(num,c);
						 break;
				case '/':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1/x2;
						 Push_Seqstack(num,c);
						 break;
				default:break;
			//	default:break;
					
				}
			}
			Push_Seqstack1(op,a[i]);
			i++;
		}
		if(a[i]=='=')//如果是=,证明a[i]以到结尾
		{
			while((Gettop_Seqstack1(op,&e1),e1)!='=')//如果不是=的话,证明栈里还有操作符,继续计算
			{
				switch(Pop_Seqstack1(op,&e1),e1)
				{
						case '+':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1+x2;
						 Push_Seqstack(num,c);
						 break;
				case '-':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1-x2;
						 Push_Seqstack(num,c);
						 break;
				case '*':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1*x2;
						 Push_Seqstack(num,c);
						 break;
				case '/':Pop_Seqstack(num,&x1);
					     Pop_Seqstack(num,&x2);
						 c=x1/x2;
						 Push_Seqstack(num,c);
						 break;
				default:break;
			}
		}
	}
		}
	//	Destroy_seqstack(&num);//不能销毁
	//	Destroy_seqstack1(&op);//不能销毁,否则返回的e无值
   return (Pop_Seqstack(num,&e),e);	//	  
}
int main()
{
	char a[100];
	int result;
	printf("请输入要计算的表达式:");
//	getchar();
	scanf("%s",a);
	getchar();
	result=jisuan(a);
	printf("result=%d\n",result);
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值