表达式求值

代码是最初版的,还没有往深的改,算是一个半成品,只能做加减乘除取余运算,其他功能有时间再加。

#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 10
typedef struct
{
	char elem[MAXSIZE];   //保存进来的字符型数字元素或运算符
	int data[MAXSIZE];	  //保存转为数字的数字元素(做的目的是方便计算)
	int top;
}SeqStack;
SeqStack *InitStackchar();
int Empty(SeqStack *s);    //判空栈
int Push(SeqStack *s,char x);  //入栈
int Push1(SeqStack *s,int x);  //数字入栈
int Pop(SeqStack *s,char *x);  //出栈
int Pop1(SeqStack *s,int *x);  //数字出栈
char GetTop(SeqStack *s);      //取栈顶
int Exp();     //主要函数   
int In(char ch,char *opset);   //判断元素是否属于运算符的一种
char compare(char x,char ch);    //作对比
int CoutNum(int th2,int th1,char op);   //计算
int main()
{
	int val;
	val=Exp();
	printf("%d\n",val);
	return 0;
}

SeqStack *InitStackchar()
{
	SeqStack *s;
	s=(SeqStack *)malloc(sizeof(SeqStack));
	s->top=-1;
	return s;
}

int Empty(SeqStack *s)      //判空栈
{
	if(s->top==-1) return 1;
	else return 0;
}


int Push(SeqStack *s,char x)  //入栈
{
	if(s->top==MAXSIZE-1) return 0;
	else
	{
		s->top++;
		s->elem[s->top]=x;
		return 1;
	}
}

int Push1(SeqStack *s,int x)  //入栈
{
	if(s->top==MAXSIZE-1) return 0;
	else
	{
		s->top++;
		s->data[s->top]=x;
		return 1;
	}
}

int Pop(SeqStack *s,char *x)   //出栈
{
	if(Empty(s)) return 0;
	else
	{
		*x=s->elem[s->top];
		s->top--;
		return 1;
	}
}

int Pop1(SeqStack *s,int *x)
{
	if(Empty(s)) return 0;
	else
	{
		*x=s->data[s->top];
		s->top--;
		return 1;
	}
}

char GetTop(SeqStack *s)     //取栈顶第一个元素
{
	if(Empty(s)) return 0;
	else return (s->elem[s->top]);
}

int Exp()
{
	int data,val,th2,th1;
	char x,op;
	char ch,ch1,opset[7]={'+','-','*','/','%','#'};
	SeqStack *OPRD,*OPTR;
	OPRD=InitStackchar();
	OPTR=InitStackchar();
	Push(OPTR,'#');
	printf("\n\nPlease Input an expression:");
	ch=getchar();
	ch1=getchar();
	while(ch!='#'||GetTop(OPTR)!='#')
	{
		if(!In(ch,opset))         //将字符型转为整形
		{
			data=ch-'0';
			ch=getchar();
			ch1=getchar();
			while(!In(ch,opset))
			{
				data=data*10+ch-'0';
				ch=getchar();
				ch1=getchar();
			}
			Push1(OPRD,data);
		}
		else
		{
			switch(compare(GetTop(OPTR),ch))    //判断
			{
				case '<':Push(OPTR,ch);
					ch=getchar();
					ch1=getchar();break;
				case '=':Pop(OPTR,&x);
					ch=getchar();
					ch1=getchar();break;
				case '>':Pop(OPTR,&op);
					Pop1(OPRD,&th2);
					Pop1(OPRD,&th1);
					val=CoutNum(th1,th2,op);
					Push1(OPRD,val);
					break;
			}
		}
	}
//	val=GetTop(OPRD);
	return val;
}

int In(char ch,char *opset)
{
	int i;
	for(i=0;i<7;i++)
	{
		if(ch==opset[i]) return 1;
	}
	return 0;
}

char compare(char x,char ch)        //顺序不可改变
{
	if(x=='*'||x=='/'||x=='%') return '>';
	else if(ch=='*'||ch=='/'||ch=='%') return '<';
	else if(x=='+'||x=='-') return '>';
	else if(ch=='+'||ch=='-') return '<';
	else return '=';
}

int CoutNum(int th1,int th2,char op)
{
	if(op=='+') return (th1+th2);
	else if(op=='-') return (th1-th2);
	else if(op=='*') return (th1*th2);
	else if(op=='/') return (th1/th2);
	else if(op=='%') return (th1%th2);
	else return 0;
}

这个代码大部分是从书上搬去过来的,但是书上只给你讲了思路,并没有全部都告诉你。算是有利有弊吧,所以上面的代码看着会比较繁琐,都是我一个字一个字打的,实在不想删,只能在原有代码上加东西。想IN()函数,COMPARE()函数等,都是我自己加的。如果说再给我一次机会的话,不,以后的代码还是先自己理解在打出来,按书上来的实在是太坑了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值