作业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内的运算。