> 文档中心 > 假设一算术表达式的所有操作数均为10以内的整数,请编写代码实现表达式求值【C语言】

假设一算术表达式的所有操作数均为10以内的整数,请编写代码实现表达式求值【C语言】

假设算术表达式满足:

(1) 小括号已匹配;

(2) 表达式无除0错误;

(3) 表达式中间没有多余的空格。

要求: 表达式计算的中间值可以是负数或者实数

【输入形式】第一行输入表达式字符串
【输出形式】第二行输出计算结果(保留两位小数)
【样例输入】(4+1*(5-2))-6/3
【样例输出】5.00

代码实现:

#include #include #define MAXSIZE 1024#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct {//队列结构定义   ElemType      data[MAXSIZE];   intfront;   intrear; }SequenQueue;//初始化队列SequenQueue* InitQueue(){SequenQueue* Q = NULL;Q = (SequenQueue*)malloc(sizeof(SequenQueue));Q->front = Q->rear = 0;return Q;}//判断队列是否为空int EmptyQueue(SequenQueue* Q){if(Q->front == Q->rear)return TRUE;elsereturn FALSE;}//判断队列是否满int FullQueue(SequenQueue* Q){/**完善代码***/if((Q->rear+1)%MAXSIZE==Q->front)return TRUE;elsereturn FALSE;}//进队int EnQueue(SequenQueue* Q, ElemType e){if(FullQueue(Q))return FALSE;Q->data[Q->rear] = e;Q->rear = (Q->rear+1)%MAXSIZE;return TRUE;}//出队int DeQueue(SequenQueue* Q, ElemType *e){/***完善代码****/if(EmptyQueue(Q))return FALSE;else{*e = Q->data[Q->front];Q->front=(Q->front+1)%MAXSIZE;return TRUE;}}//取队头元素ElemType GetHead(SequenQueue* Q){return Q->data[Q->front];}typedef struct {//顺序栈定义ElemType data[MAXSIZE]; int top; //栈顶指针}SequenStack;//初始化栈SequenStack* InitStack( ){SequenStack *S = (SequenStack*)malloc(sizeof(SequenStack));S->top = -1;return S;}//判断栈是否为空int EmptyStack(SequenStack *S){if(-1 == S->top)return TRUE;else return FALSE;}//判断栈是否满int FullStack(SequenStack *S){/****完善以下代码****/if(S->top+1==MAXSIZE)return TRUE;else return FALSE;}//进栈int Push(SequenStack *S, ElemType e){//判断栈是否满if(FullStack(S)){printf("栈满!");return FALSE;}/****完善以下代码******///栈顶指针加1//存值到栈顶S->top++;S->data[S->top]=e;return TRUE;}//出栈int Pop(SequenStack *S,char *e){/********完善以下代码*******/S->top--;*e=S->data[S->top+1];returnTRUE;}//取栈顶元素ElemType GetTop(SequenStack *S){return S->data[S->top];}//给运算符优先级排序// 优先级顺序:( < +, - top = -1;//从左往右扫描表达式while(*p != '\0'){if(*p >= '0' && *p <= '9') //数字直接入表达式队列{EnQueue(postfixQueue, *p);}else if('(' == *p) //左括号,直接入符号栈{/***完善代码*****/Push(signStack,*p);}else if(')' == *p) //如果是右括号,则将左括号前的所有符号出栈,并入表达式队列{do{Pop(signStack, &e); //符号出栈if(e != '(') //将非(入表达式队列/***完善代码******/EnQueue(postfixQueue,e);}while((e != '(') && (!EmptyStack(signStack)));}else //其他符号,根据优先级选择进栈{if(EmptyStack(signStack)) //如果符号栈为空,则直接将当前运算符入栈{Push(signStack, *p);}else {/*******完善代码********/while(getPriority(*p) <= getPriority(GetTop(signStack) )) //比较当前运算符与栈顶的优先级{Pop(signStack, &e); //符号出栈EnQueue(postfixQueue, e);  //运算符入表达式队列if(EmptyStack(signStack)) //判断符号栈是否为空{break;}}//将当前运算符入栈/*****完善代码******/Push(signStack,*p);}}//end elsep++;}//end while//将符号栈全部入表达式队列while(!EmptyStack(signStack)){Pop(signStack, &e);EnQueue(postfixQueue, e);}return TRUE;}double calculate(SequenQueue* postfixQueue){double a[100],S=0;ElemType e;int i = -1;while(!EmptyQueue(postfixQueue)){DeQueue(postfixQueue, &e);if(e='0'){i++;a[i]=(double)(e-'0');}switch(e){case'+':S = a[i-1]+a[i];i--;a[i]=S;break;case'-':S = a[i-1]-a[i];i--;a[i]=S;break;case'*':S = a[i-1]*a[i];i--;a[i]=S;break;case'/':S = a[i-1]/a[i];i--;a[i]=S;break;}}return S;}int main(int argc, char *argv[]){SequenQueue *postfixQueue = NULL; //表达式队列char expression[100];//输入计算表达式gets(expression);postfixQueue = InitQueue();  //初始化后缀表达式队列Trans(expression, postfixQueue);printf("%.2f\n", calculate( postfixQueue));return 0;}

三国人物百科