利用栈进行表达式求值


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

#define M 100
typedef struct
{
	char character[M];//运算符
	int top;
}Stack; 
typedef struct
{
	int character[M];//运算数字
	int top;
}nStack; 

void InitStack(Stack *S)
{
	//S = (Stack*)malloc(sizeof(Stack));
	S->top = -1;
}

void InitStackn (nStack *S)
{
	//S = (nStack*)malloc(sizeof(Stack));
	S->top = -1;
}


int Push(Stack *OPTR,char ch)
{
	if(OPTR->top == M - 1)
	{
		printf("栈满了!");
		return 0;
	}
	OPTR->top++;
	OPTR->character[OPTR->top] = ch;
	return 1;
}

int Pushn(nStack *OPTR,int x)
{
	if(OPTR->top == M - 1)
	{
		printf("栈满了!");
		return 0;
	}
	OPTR->top++;
	OPTR->character[OPTR->top] = x;
	return 1;
}
int Pop(Stack *OPTR,char *op)
{
	if(OPTR->top == -1)
	{
		printf("运算符栈空了!");
		return 0;
	}
		
	*op = OPTR->character[OPTR->top];
	OPTR->top--;
	return 1;
}
int Popn(nStack *OPTR,int *op)
{
	if(OPTR->top == -1)
	{
		printf("数字栈空了!");
		return 0;
	}
		
	*op = OPTR->character[OPTR->top];
	OPTR->top--;
	return 1;
}
char GetTop(Stack OPTR)
{
	if(OPTR.top == -1)
	{
		printf("运算符栈为空的!\n");
		return 0;
	}
	return OPTR.character[OPTR.top];
}

int GetTopn(nStack OPTR)
{
	if(OPTR.top == -1)
	{
		printf("数字栈为空的!\n");
		return 0;
	}
	return OPTR.character[OPTR.top];
}
//判断C是否为操作符
bool In(char ch)
{
	switch(ch)
	{
	case '+':
	case '-':
	case '*':
	case '/':
	case '#':
		return true;
		break;
	default:
		return false;
	}
}
/*或者定义一个数组
  char ops[5]={'+','-','*','/','#'};
int In(char ch)        /*判断输入字符是否为运算符函数,是返回TRUE,不是返回FALSE
{
	int i;
	for (i=0;i<5;i++)
	{
		if(ch==ops[i])
			return 0;
	}
	return 1;
}
*/
char Compare(char ch1,char ch2)
{
	char f;
	switch(ch2)
	{
	case '+':
	case '-':if(ch1=='#')
				 f='>';       //进栈
		else
			f='<';           //出栈
		break;
	case '*':
	case '/':if(ch1=='*'||ch1=='/')
				 f='<';
		else
			f='>';
		break;

	case '#':if(ch1 == '#')
			f = '=';
		else
			f = '<';
		break;
	}
	return f;
}
int  Execute(int a,char op,int b)
{
	int c;
	switch(op)
	{
	case '+':
		c = a + b;
		break;
	case '-':
		c = a - b;
		break;
	case '*':
		c = a*b;
		break;
	case '/':
		c = a/b;
		break;
	}
	return c;
}
int ExpEvluation()
{
	int v,temp;
	char *str;
	char ch;
	int a,b;
	char op;
	int i = 0;


	Stack OVS;//运算符栈
	nStack OPTR;//运算数栈
	
	//初始化两个栈
	InitStack(&OVS);
	InitStackn(&OPTR);

	Push(&OVS,'#');            //为了运算方便先在符号栈里面压入“#”
	printf("请输入一个表达式(以'#'结束):\n");
	
	str = (char *)malloc(100*sizeof(char));
	gets(str);

	ch = str[i];
	i++;
	while(ch != '#'||GetTop(OVS) != '#')//当读入的字符和栈顶的字符均为‘#’时结束运算
	{
		//判断是否为运算符,选择出运算数字

		if(!In(ch))//刚读入的不是运算符是运算数
		{
			temp = ch - '0';   /*将字符转换为十进制数*/
			ch = str[i];
			i++;
			Pushn(&OPTR,temp);
		}
		else
		{
			switch(Compare(GetTop(OVS),ch))          //比较栈顶元素和刚读入运算符的优先级
			{
			case '>':
				Push(&OVS,ch);
				ch = str[i];
				i++;
				break;
			case '= ':
				Pop(&OVS,&op);
				ch = str[i];
				break;
			case '<':
				Pop(&OVS,&op);
				Popn(&OPTR,&b);
				Popn(&OPTR,&a);

				v = Execute(a,op,b);
				Pushn(&OPTR,v);
				break;
			}
		}
	}
		v = GetTopn(OPTR);
		return (v);
}	
int main()
{
	int a;
	a = ExpEvluation();
	printf("%d",a);
	printf("\n");
	return 0;

}

 

转载于:https://my.oschina.net/u/2537693/blog/811827

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值