express

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


const int Size = 50;
char Stack[Size];
char SuffixExpression[Size];    /*后缀表达式数组*/
int top = -1;   /*始终指向栈顶*/
int index = 0;  /*后缀表达式索引*/

/*----------------栈基本操作-------------*/
void Push(char x)  /*压栈*/
{
	if (top == Size-1)
	{   
		printf("top=%d stack overflow\n", top);
		exit(1);
	}
	Stack[++top] = x;
}

char Pop()  /*出栈*/
{
	if (top == -1)
	{
		printf("top=%d stack overflow\n", top);
		exit(1);
	}
	return Stack[top--];
}

char GetTop() /*获取栈顶元素*/
{
	if (-1 != top)
	{
		return Stack[top];
	}
	return NULL;
}

bool Empty()  /*判断栈是否为空*/
{
	return (top == -1 ?  1: 0);
}


/*------------计算结果-----------------*/
int Calc(int num1, int num2, char op)
{
	switch(op)
	{
		case '+':
		     return num1 + num2;
	    case '-':
		     return num1 - num2;
	    case '*':
		     return num1 * num2;
	    case '/':
		     if (0 == num2)
			 {
				 printf("The divisor is 0\n");   
				 exit(1);
			 }
		     return num1 / num2;    
	    default:
		     return 0;
	}
}

/*-----------运算符优先级比较--------------*/
int PriorityCompare(char op1, char op2)
{
	switch(op1)
	{
		case '+':
		case '-':
		     return (op2 == '*' || op2 == '/' ? -1:0);
		case '*':
		case '/':
		     return (op2 == '+' || op2 == '-' ?  1:0);
		case '(':
			 return 1;
		default:
			 return 1;
	}
	return 1;
}

/*-----------判断字符是否是运算符---------*/
int OperatorSymbol(char op)
{
	switch(op)
	{
	    case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
			return 1;
		default :
			return 0;
	}
	return 0;
}

/*--------将中缀表达式转换成后缀表达式------------*/
void ConvertSuffixExpression(const char* p)
{
	while(*p != '\0')
	{
		if(isdigit(*p))  /*处理数字*/
		{
			SuffixExpression[index++] = *p;
			p++;
		}
		else if(1 == OperatorSymbol(*p))  /*处理运算符*/
		{
			if (Empty())  /*栈为空,运算符直接入栈*/
			{
				Push(*p);
				p++;
			}
			else if ('(' == *p)   /*左括号直接压栈*/
			{
				Push(*p);
				p++;
			}
			else if(')' == *p)   /*右括号取出栈中()之间的运算符*/
			{
				while('(' != GetTop())   
				{
					SuffixExpression[index++] = GetTop();
					Pop();
				}

				Pop();   /* '(' 出栈*/
				p++;
			}
			else if(1==PriorityCompare(*p,GetTop()) || '('==GetTop())  /*当前运算符比栈顶运算符优先级高或栈顶为左括号则直接入栈*/
			{
				Push(*p);
				p++;
			}
			else
			{
				while (1!=PriorityCompare(*p,GetTop()) && !Empty())  /*栈顶运算符优先小于等于当前运算符优先级则出栈*/
				{
					if ('(' == GetTop())   /*栈顶为左括号*/
					{
						continue;
					}

					SuffixExpression[index++] = GetTop();
					Pop();
				}

				Push(*p);
				p++;
			}
		}
		else
		{
			printf("%c is invaild symbol\n", *p);
			exit(1);
		}
	}

	while(!Empty())
	{
		SuffixExpression[index++] = GetTop();
		Pop();
	}

	SuffixExpression[index++] = '\0';
}

/*------------根据后缀表达式计算结果----------*/
int Calculate()
{
	int i;
	char TempSum;
	int num1, num2;
	int len = strlen(SuffixExpression);

	for(i=0; i<len; i++)
	{
		if (isdigit(SuffixExpression[i]))  /*数字直接压栈*/
		{
			Push(SuffixExpression[i]);
		}
		else if (OperatorSymbol(SuffixExpression[i])) /*当前符号是运算符则从栈中取出两个数运算,将结果继续压栈*/
		{
			num1 = GetTop()-'0';
            Pop();
			num2 = GetTop()-'0';
			Pop();

			TempSum = Calc(num2, num1, SuffixExpression[i]) + '0';

			Push(TempSum);
		}
	}

	return GetTop()-'0'; /*栈顶值即为表达式值*/
}
int expr(const char* p)
{   
	if (NULL == p)
	{
		printf("null pointer\n");
		exit(1);
	}

	memset(Stack, 0, Size);
	memset(SuffixExpression, 0, Size);

	ConvertSuffixExpression(p);
	return Calculate();
}

void main ()
{
	/*char *exp = "9+(3-1)*3+8/2";*/
	/*char *exp = "1";*/
	/*char *exp = "1+2";*/
	/*char *exp = "3-2";*/
	/*char *exp = "1+2+3";*/
	/*char *exp = "3-2-1";*/
	/*char *exp = "(1+2)-3";*/
	char *exp = "9*1+(2-1)+2*3";
	int sum = expr(exp);

	printf("%s\n", SuffixExpression); 
	printf("%d\n", sum);
}

 
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值