表达式求值
Posted 南笙一梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式求值相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define MaxSize 20
#define MaxOp 7
struct //设定运算符的优先级
char ch; //运算符
int pri; //优先级
lpri[] = '=',0,'(',1,'*',5,'/',5,'+',3,'-',3,')',6,
rpri[] = '=',0,'(',6,'*',4,'/',4,'+',2,'-',2,')',1;
int leftpri(char op) //求左运算符op的优先级
int i;
for(i = 0; i<MaxOp; i++)
if(lpri[i].ch == op)
return lpri[i].pri;
int rightpri(char op) //求右运算符op的优先级
int i;
for(i = 0; i<MaxOp; i++)
if(rpri[i].ch == op)
return rpri[i].pri;
bool InOp(char ch) //判断ch是否为运算符
if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
else
return false;
int Precede(char op1, char op2) //op1 和 op2运算符优先级的比较结果
if(leftpri(op1) == rightpri(op2))
return 0;
else if(leftpri(op1) < rightpri(op2))
return -1;
else
return 1;
void trans(char *exp, char postexp[])
struct
char data[MaxSize];
int top;
op;
int i = 0;
op.top = -1;
op.top++;
op.data[op.top] = '=';
while(*exp != '\\0')
if(!InOp(*exp))
while(*exp >= '0' && *exp <='9')
postexp[i++] = *exp;
exp++;
postexp[i++] = '#';
else
switch(Precede(op.data[op.top],*exp))
case -1:
op.top++;
op.data[op.top] = *exp;
exp++;
break;
case 0:
op.top--;
exp++;
break;
case 1:
postexp[i++] = op.data[op.top];
op.top--;
break;
while(op.data[op.top] != '=')
postexp[i++] = op.data[op.top];
op.top--;
postexp[i] = '\\0';
float compvalue(char * postexp)
struct
float data[MaxSize];
int top;
st;
float d,a,b,c;
st.top = -1;
while (*postexp != '\\0')
switch(*postexp)
case '+':
a = st.data[st.top];
st.top--;
b = st.data[st.top];
st.top--;
c = a+b;
st.top++;
st.data[st.top] = c;
break;
case '-':
a = st.data[st.top];
st.top--;
b = st.data[st.top];
st.top--;
c = b-a;
st.top++;
st.data[st.top] = c;
break;
case '*':
a = st.data[st.top];
st.top--;
b = st.data[st.top];
st.top--;
c = a*b;
st.top++;
st.data[st.top] = c;
break;
case '/':
a = st.data[st.top];
st.top--;
b = st.data[st.top];
st.top--;
if(a != 0)
c = b/a;
st.top++;
st.data[st.top] = c;
else
printf("\\n\\t除零错误!\\n");
exit(0);
break;
default:
d = 0;
while(*postexp >= '0' && *postexp <='9')
d = 10 * d + *postexp - '0';
postexp++;
st.top++;
st.data[st.top] = d;
break;
postexp++;
return (st.data[st.top]);
int main()
char exp[MaxSize];
char postexp[MaxSize];
while(true)
printf("请输入表达式:");
gets(exp);
trans(exp, postexp);
printf("表达式的值:%g\\n",compvalue(postexp));
return 0;
心得体会:栈的东西,一定要注意指针的移动,指向的位置。
以上是关于表达式求值的主要内容,如果未能解决你的问题,请参考以下文章