用C语言顺序栈完成表达式求值(优先级)

作业5:表达式求值

表达式求值是程序设计语言编译的一个最基本问题,其中任何一个表达式都是由操作数、运算符(±*/)、界限符(#,(,),[,] )组成。输入一个算术表达式,求其值。要求表达式以“=”结束,操作数为多位实数,对错误表达式要进行检测。设计算法并编程实现。

/*思路:利用两个栈,一个栈存放表达式的数字,另一个栈存放表达式的字符。利用优先级进行比较。*/

#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
typedef struct {
 int *top;
 int *base;
 int stacksize;
}node,node2;

//初始化
node InitStack(){
	node L;
	L.base=(int*)malloc(SIZE*sizeof(int));
	L.top=L.base;
	L.stacksize=SIZE;
	return L;
}
//入栈
void Push(node *L,char e){
	if(L->top-L->base==SIZE){
		printf("error");
		exit(0);
	}
	*L->top++=e;
}
//出栈
void Pop(node *L,int *e){
	if(L->top==L->base){
		printf("error");
		exit(0);
	}
	*e=*--L->top;
}
char GetTop(node L){
	if(L.top-L.base==SIZE){
		printf("error");
		exit(0);
	}
	return *--L.top; 
}

node2 InitStack2(){
	node2 L;
	L.base=(int*)malloc(SIZE*sizeof(int));
	L.top=L.base;
	L.stacksize=SIZE;
	return L;
}
//入栈
void Push2(node2 *L,int e){
	if(L->top-L->base==SIZE){
		printf("error");
		exit(0);
	}
	*L->top++=e;
}
//出栈
void Pop2(node2 *L,char *e){
	if(L->top==L->base){
		printf("error");
		exit(0);
	}
	*e=*--L->top;
}
char GetTop2(node2 L){
	if(L.top-L.base==SIZE){
		printf("error");
		exit(0);
	}
	return *--L.top; 
}

//判断优先级
char Precede(char a,char b){
	if((a=='('&&b==')')||(a=='#'&&b=='#'))
		return'=';
	else if(a=='('||a=='#'||b=='('||(a=='+'||a=='-')&&(b=='*'||b=='/'))
	return '<';
    else
		return '>';

}
//判断输入是不是字符串
int In(char e){
	if(e=='+'||e=='-'||e=='*'||e=='('||e==')'||e=='#')
		return 1;//是
	else 
		return 0;//不是

}


//求和
int operate(int a,char b,int c ){
	if(b=='+')return a+c;
	else if(b=='-')return a-c;
	else if(b=='*')return a*c;
	else if(b=='/')return a/c;

}
int main()
{
    node YSF;//字符
    node2 CZS;//数字
    char a,b;
	char theta;
    char ch,e;
	int x;
	CZS=InitStack2();
    YSF=InitStack();
    Push(&YSF,'#');
    printf("-------please enter the number (end of '#')--------\n");//只能进行0-9内的计算
    ch=getchar();
    while(ch!='#'||GetTop(YSF)!='#')
    {
		if(!In(ch)){
			Push2(&CZS,ch-'0');//字符型数字转整型
			ch=getchar();
		}
		else{
            switch(Precede(GetTop(YSF),ch))
            {
            case '>'://弹出存放数字栈中的两个元素,弹出存放字符栈的一个字符元素。求和
                theta=GetTop(YSF);
                Pop(&YSF,&x);
                b=GetTop2(CZS);
                Pop2(&CZS,&e);
                a=GetTop2(CZS);
                Pop2(&CZS,&e);
                Push2(&CZS,operate(a,theta,b));
                break;
            case '='://弹出弹出存放字符栈的一个字符元素
                Pop(&YSF,&x);
                ch=getchar();
                break;
            case '<':
                Push(&YSF,ch);
                ch=getchar();
                break;
            }
        }
    }
    printf("%d\n",GetTop2(CZS));
    return 0;
}

结果如下:

 

遇到的问题:1:因为为字符型数字存入栈时要转化为整型,且因为getchar()一次只能识别一个字符,字符型数字只有0——9,所以只能进行0——9内的运算。 

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值