表达式求值

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MAXSIZE 10

typedef struct CharStack
{
	int top;
	int data[MAXSIZE];
}*CharStackPtr;
//初始化
CharStackPtr initStack()
{
	CharStackPtr newPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
	newPtr->top = -1;
	return newPtr;
} 
//判断是否为空
int isEmpty(CharStackPtr newStack)
{
	if(newStack->top == -1)
	return 0;
	else
	return 1;
} 
//判断是否为满栈
int isFull(CharStackPtr newStack)
{
	if(newStack->top >= MAXSIZE-1)
	return 1;
	else
	return 0;
}
//获取栈顶元素
int getTop(CharStackPtr newStack) 
{
	if(newStack->top == -1)
	return 0;
	else
	return newStack->data [newStack->top];
}
//输出 
void outputStack(CharStackPtr newStack)
{
	int i;
	for(;i<=newStack->top;i++)
	{
		printf("%c ",newStack->data[i]);
	}
	printf("\r\n");
}
//进栈
void push(CharStackPtr newStack,int newData)
{
	//判断栈满
	if(isFull(newStack))
	{
		printf("The stack is full.\n");
		return ;
	}
	newStack->top++;
	newStack->data[newStack->top] = newData;		 
} 
//出栈
int pop(CharStackPtr newStack,int e)
{
	//判断栈空
	if(!isEmpty(newStack))
	{
		printf("The stack is empty.\n");
		return ;
	} 
	newStack->top--;
	e = newStack->data[newStack->top+1];
    return ;//返回删除的元素 
}
//判断是否为运算符号 
int In(char c)
{
	if(c == '+'||c == '-'||c == '/'||c =='*'||c == '('||c == ')'||c == '=')
	return 1;
	else
	return 0;
} 
//计算
int Operate(int a,char theta,int b)
{
	switch(theta)
	{
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '/':if(b!=0)
				  return a/b;
				else
				  {
					printf("Divisor can not be zero!\n");
					return 0;
				  }
	}	
} 
//判断优先级 
char Precede(char theta1,char theta2)
{
	int i,j;
	char pre[][7]={// +   -   *   /   (   )   = 
		             {'>','>','<','<','<','>','>'},  
                     {'>','>','<','<','<','>','>'},  
                     {'>','>','>','>','<','>','>'},  
                     {'>','>','>','>','<','>','>'},  
                     {'<','<','<','<','<','=','0'},  
                     {'>','>','>','>','0','>','>'},  
                     {'<','<','<','<','<','0','='}}; 
    switch(theta1)
	{
    	case '+': i=0; break;  
        case '-': i=1; break;  
        case '*': i=2; break;  
        case '/': i=3; break;  
        case '(': i=4; break;  
        case ')': i=5; break;
        case '=': i=6; break;
	}
	switch(theta2)
	{
    	case '+': j=0; break;  
        case '-': j=1; break;  
        case '*': j=2; break;  
        case '/': j=3; break;  
        case '(': j=4; break;  
        case ')': j=5; break;
        case '=': j=6; break;
    }
    return(pre[i][j]);
}
int evaluateExpression(char *exp)
{
	CharStackPtr OPND = initStack();//运算数栈
	CharStackPtr OPTR = initStack();//运算符栈
	int a,b,theta,x1,x2,x,i = 0;
	char ch;
	
	push(OPTR,'=');
	ch = exp[i++];
	
	while(ch!='='||getTop(OPTR)!='=')
	{
		if(In(ch))
		{
			switch(Precede(getTop(OPTR),ch))
			{
				case '<':
					push(OPTR,ch);
					ch = exp[i++];
					break;
				case '>':
					pop(OPTR,theta);
					pop(OPND,b);
					pop(OPND,a);
					push(OPND,Operate(a,theta,b));
					break;
				case '=':
					pop(OPTR,x);
					ch = exp[i++];
					break;
			}
		}
		else if(ch <= 9&&ch >= 0)
		{
			x1 = ch-'0';
			push(OPND,x1);
			x2 = x1;
			ch = exp[i++];
			
			while(ch <= 9&&ch >= 0)
			{
				x1 = ch -'0';
				x2 = 10*x2+x1;
				pop(OPND,x);
				push(OPND,x2);
				ch = exp[i++];
			}
		}
		else if(ch==' ')
		{
			while(ch == ' ')
			{
				ch =exp[i++];
			}
		}
		else
		{
			printf("Input has illegal characters!\n");
			exit(0);
		}
	}
	return (getTop(OPND));
} 
int main()
{
	char exp[150];
	int result;
	printf("please input:\n");
	gets(exp);
	result = evaluateExpression(exp);
	printf("\n%s%d\n",exp,result);
	return 0;
}

总结:代码规范非常重要,要不然别人有可能看不懂,同时要学会加注释

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenshengnannn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值