您的位置:

算术表达式求值数据结构c语言,表达式求值数据结构 c语言

本文目录一览:

C语言编程(数据结构):表达式求值

/*在TC2 和 VC6下都可以顺利运行。

做了一个下午。一定要用我这个噢。

有简单的输入错误检测。有完整的说明和

注释*/

#includestdio.h /*库文件包含*/

#includestring.h /*用于字符串操作*/

#includestdlib.h /*用于exit函数*/

/**************************************************************************

int check(char *c)

输入参数:

char *c: 输入的字符串

返回参数:

0:字符串中有不符合规定的字符

1: 字符串字符符合规定,没有不符合规定的字符.

功能:

检查字符串中有否除了 0-9, +,-,*,/,(,),之外的其他字符,

如果有,则返回0, 表示出现错误。

若没有,则返回1,表式字符串符合规定。

**************************************************************************/

int check(char *c)

{

int k=0;

while(*c!='\0')

{

if((*c='0' *c='9') || *c=='+' ||

*c=='-' || *c=='*' || *c=='/' ||

*c=='.' || *c=='(' || *c==')' )

{

}

else

{

printf("input error, there have the char not the math expression char!\n");

return 0;

}

if(*c=='(')

k++;

else if(*c==')')

k--;

c++;

}

if(k!=0)

{

printf("input error, there is not have correct bracket '()'!\n");

return 0;

}

return 1;

}

/**************************************************************************

void move(char *f, double *s,int p)

输入参数:

char *f : 运算符数组

double *s: 数值数组

int p: 当前运算符数组位置。

返回参数:

功能:

将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。

传入值p若为3

则当前符号的数组位置为3.

f[3]=f[3+1].......f[len-2]=f[len-1] f[len-1]='\0';

s[i]=s[i+1].......s[len-1]=s[len] 因为数值比运算符多一个。

***************************************************************************/

void move(char *f, double *s,int p)

{

int i=0,len=strlen(f);

for(i=p; ilen; i++) /*将已经运算过的符号,空出来的位置用后面的符号来填充,*/

{ /*即把乘和除号的位置用后面的加和减号填充*/

f[i]=f[i+1];

s[i]=s[i+1];

}

s[i]=s[i+1];

f[len-1]='\0';

}

/**************************************************************************

double convnum(char *c)

输入参数:

char *c :由数字和小数点组成的字符,用以转换成double型的数值。

返回参数:

num:返回转换好的值。

功能:

将输入的字符串先将其小数点以前的部分复制到temp[]数组中,

若有小数点,则将小数点之后的数值,也就是小数部分先进行计算,值存入num中

计算完成后,再对整数部分进行计算,值加上小数部分的值,存入num中。

***************************************************************************/

double convnum(char *c)

{

double num=0.0;

double a=1.0;

int i=0,p=0,len=0;

char temp[100];

int tempi=0;

int start=0;

int f=1; /*正负符号指示器,若为1则为正数,为-1,此数为负数*/

len=strlen©;

if(c[0]=='-')

{

start=1;

f=-1;

}

for(i=start; ilen; i++)

{

if(c[i]=='.')

{

p=i;

break;

}

temp[tempi++]=c[i]; /*将整数部分复制到temp[]中*/

}

temp[tempi]='\0';

if(p!=0)

{

for(i=p+1;ilen;i++) /*将小数部分计算出来*/

{

if(c[i]=='.') /*如果有多余的小数点,则表示输入错误*/

{

printf("there is more that one dot '.' in number!error!\n");

exit(0);

}

a=a*0.1;

num+=(a*(c[i]-48));

}

}

a=1.0;

len=strlen(temp); /*计算整数部分*/

for(i=len-1;i=0; i--)

{

num=num+(a*(temp[i]-48));

a*=10;

}

num=num*f;

return num;

}

/**************************************************************************

double good(char *c)

输入参数:

char *c :即将进行运算的字符串型数学表达式。如3.5+(2*3/5)

返回参数:

s[0]:计算结果将放入s[0]中

功能:

将输入的字符串中的数字分别调用convnum(char *c)函数进行数值变换,再将其依

次存入doulbe s[i]中,将加减乘除运算符依次存入字符串符号数组 char f[i]中,

然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此

good(char *c) 递归函数进行递归运算。 然后根据先乘除,后加减的顺序对已

存入数组的数值根 据存入字符串符号数组的运算符进行运算。结果存入s[0]中。

返回最终结果。

***************************************************************************/

double good(char *c) /*可递归函数*/

{ /*取得数值字符串,并调用convnum转换成double*/

char g[100],number[30]; /*g,保存当前的表达式串,number保存一个数的所有字符*/

char f[80]; /*保存所有的符号的堆栈*/

int fi=0; /*保存符号的位置指针*/

double s[80]; /*保存当前所有的数的一个堆栈*/

int si=0; /*保存数字位置指针*/

int k=0; /* 若k=1则表示有一对括号*/

int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/

int cc=0; /*乘除符号数量*/

int jj=0; /*加减符号数量*/

while(*c!='\0')/*当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/

{

k=0;

num=0;

switch(*c)

{

case '+': /*当前字符为+-乘除时则表示*/

case '-':

case '*':

case'/':

f[fi++]=*c;

if(*c=='*' || *c=='/')

cc++;

else

jj++;

if(*(c-1)!=')')

{

number[i]='\0';

i=0;/*完成一个数字的复制,其位置指针i=0*/

s[si++]=convnum(number);

}

break;

case'(': /*有括号,则将当前括号作用范围内的全部字符保存,作为*/

k++; /*一个新的字符表达式进行递归调用good函数计算。*/

while(k0)

{

c++;

g[num]=*c;

num++;

if(*c==')')

{

k--;

}

else if(*c=='(')

{

k++;

}

}

g[num-1]='\0';

num=0;/*完成一个括号内容的复制,其位置指针num=0*/

s[si++]=good(g);

break;

default:

number[i++]=*c;

if(*(c+1)=='\0')

{ number[i]='\0';

s[si++]=convnum(number);

}

break;

}

c++;

}

f[fi]='\0';

i=0;

while(cc0)

{

switch(f[i])

{

case '*': cc--;

s[i+1]=s[i]*s[i+1];

move(f,s,i);

break;

case '/': cc--;

s[i+1]=s[i]/(float)s[i+1];

move(f,s,i);

break;

default:

i++;

break;

}

}

i=0;

while(jj0)

{

switch(f[i])

{

case '+': s[i+1]=s[i]+s[i+1];

jj--;

move(f,s,i);

break;

case '-': s[i+1]=s[i]-s[i+1];

jj--;

move(f,s,i);

break;

default:

printf("operator error!");

break;

}

}

return s[0];

}

void main()

{

char str[100];

double sum=0;

int p=1;

while(1)

{

printf("enter expression: enter 'exit' end of program\n");

scanf("%s",str);

p=strcmp(str,"exit");

if(p==0)

break;

p=check(str);

if(p==0)

continue;

sum=good(str);

printf("%s=%f",str,sum);

printf("\n");

}

printf("good bye!\n");

}

例:

enter expression: enter 'exit' end of program

3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(输入)

3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667

enter expression: enter 'exit' end of program

china(输入)

input error, there have the char not the math expression char!

enter expression: enter 'exit' end of program

exit(输入)

good bye!

用C语言编写程序“算术表达式求值”

#include stdio.h

#include math.h

enum state

;

int ctoi( char c)

bool isNum( char a)

bool isOp(char op)

{

switch(op)

{

case '+':

return true;

break;

case '-':

return true;

break;

case '*':

return true;

break;

case '/':

return true;

break;

default:

return false;

break;

}

}

bool isDot(char dot)

int checkString( char str[], double *a, double * b, char* op, int num)

{

enum state s = BEGIN;

int a_i = 0;

int b_i = 0;

double num1 = 0;

double num2 = 0;

int pointNum = 0;

for( int i = 0; i num; ++i)

{

if(str[i] == ' ')continue;

switch(s)

{

case BEGIN:

if(isNum(str[i]))

elses = ERROR;

break;

case P2:

if(isNum(str[i]))

else if(isDot(str[i]))

{

s = P3;

}

else if(isOp(str[i]))

{

*op = str[i];

s = P5;

}

else

s = ERROR;

break;

case P3:

if(isNum(str[i]))

{

num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum) ;

s = P4;

}

else

s = ERROR;

break;

case P4:

if(isNum(str[i]))

{

num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P4;

}

else if(isOp(str[i]))

{

*op = str[i];

s = P5;

}

else

s = ERROR;

break;

case P5:

if(isNum(str[i]))

{

num2 = num2 * 10 + ctoi(str[i]);

s = P6;

}

else

s = ERROR;

break;

case P6:

pointNum = 0;

if(isNum(str[i]))

{

num2 = num2 * 10 + ctoi(str[i]);

s = P6;

}

else if(isDot(str[i]))

{

s = P7;

}

else

s = END;

break;

case P7:

if(isNum(str[i]))

{

num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P8;

}

else

s = END;

break;

case 8:

if(isNum(str[i]))

{

num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P8;

}

else if(isOp(str[i]))

{

s = END;

}

else

s = END;

break;

case ERROR:

printf("express error. \n");

break;

}

if (s == END || s == ERROR)

break;

}

if(s==END)

else

}

int main()

{

char op;

double a;

double b;

char string[128] = ;

scanf("%s", string);

printf("the expression you input is : %s. \n", string);

getchar();

if (-1 == checkString(string, a, b, op, 128))

{

printf("error occur while checking expression. Be sure no space in your expression when input\n");

getchar();

return 0;

}

double result;

switch(op)

{

case '+':

result = a + b;

break;

case '-':

result = a - b;

break;

case '*':

result = a * b;

break;

case '/':

if(b != 0)

result = a / b;

else

{

printf(" error! %d/%d", a, b);

return -1;

}

break;

default:

printf("undefined expression.\n");

break;

}

printf("%f %c %f = %f\n", a, op, b, result);

return 0;

}

C语言表达式求值

//表达式求值

//By:jimly

//10/10/2009

//例如:输入2+2(4-6*3)=

//以"="结束,然后回车即出结果

#include stdio.h

#include conio.h

#include windows.h

#include assert.h

typedef float ElemType;

typedef struct Stack

{

ElemType *base; // 栈基址

ElemType *top; // 栈顶

int stacksize; // 栈存储空间的尺寸

} SqStack;

/*------------------------------------------------------------

// 栈的基本操作

------------------------------------------------------------*/

bool InitStack(SqStack *S);

bool InitStack(SqStack *S);

void DestroyStack(SqStack *S);

bool StackEmpty(SqStack S);

int StackLength(SqStack S);

ElemType GetTop(SqStack S, ElemType *e);

void StackTraverse(SqStack S, void (*fp)(ElemType));

bool Push(SqStack *S, ElemType e);

bool Pop(SqStack *S, ElemType *e);

/*------------------------------------------------------------

// 表达式求值的操作函数定义

------------------------------------------------------------*/

char Precede(char A1,char A2);

ElemType Operate(ElemType a,ElemType theta,ElemType b);

bool In(char c,char op[]);

ElemType EvaluateExpression();

void Menu();//////////////////////////////////////////////

// Eval_exdivssion.cpp 表达式求值实现函数 //

//////////////////////////////////////////////

/*------------------------------------------------------------

操作目的: 判定运算符栈的栈顶运算符A1和读入的运算符A2之间优先关系的函数

初始条件: 无

操作结果: 判断出优先关系

函数参数:

char A1 运算符

char A2 运算符

返回值:

char 大小关系

------------------------------------------------------------*/

char Precede(char A1,char A2)

{

if (A1 == '+' || A1 == '-')

{

if (A2 == '+' || A2 == '-' || A2 == ')' || A2 == '=')

{

return '';

}

else

return '';

}

if (A1 == '*' || A1 == '/')

{

if (A2 == '(')

{

return '';

}

else

return '';

}

if (A1 == '(')

{

if (A2 == ')')

{

return '=';

}

if (A2 == '=')

{

return 'E';

}

else

return '';

}

if (A1 == ')')

{

if (A2 == '(')

{

return 'E';

}

if (A2 == '=')

{

return 'E';

}

else

return '';

}

if (A1 == '=')

{

if (A2 == '=')

{

return '=';

}

else

return '';

}

else

return '=';

}

/*------------------------------------------------------------

操作目的: 二元运算a与b的函数

初始条件: 无

操作结果: 返回运算结果

函数参数:

ElemType a 操作数

ElemType theta 操作符

ElemType b 操作数

返回值:

ElemType 运算结果

------------------------------------------------------------*/

ElemType Operate(ElemType a,ElemType theta,ElemType b)

{

switch(char(theta))

{

case '+':

return a += b;

break;

case '-':

return a -= b;

break;

case '*':

return a *= b;

break;

case '/':

if(b==0)

{

printf("除数不能为0!!\n");

exit(0);

}

return a /= b;

break;

} return 0;

}

/*------------------------------------------------------------

操作目的: 判断字符c是否属于运算符集合op

初始条件: 无

操作结果: 返回判断结果

函数参数:

char c 要判断的字符

char op[] 运算符集合

返回值:

bool 属于返回true 否则返回false

------------------------------------------------------------*/

bool In(char c,char op[])

{

for (int i = 0;i7;i++)

{

if (op[i] == c)

return true;

}

return false;

}

/*------------------------------------------------------------

操作目的: 算术表达式求值的运算符优先算法

初始条件: 无

操作结果: 返回表达式的值

函数参数:

返回值:

ElemType 运算结果

------------------------------------------------------------*/

ElemType EvaluateExpression()

{

SqStack OPTR; //运算符栈

SqStack OPND; //运算数栈

char Ct = '='; //判断是否结束的标识

int i = 0,j = 1;

ElemType e = 0,t = 0,c;

char op[7] = {'+','-','*','/','(',')','='}; InitStack(OPTR); //初始化

Push(OPTR,Ct);

InitStack(OPND); //初始化 c = (float)getchar();

while (c!='=' || GetTop(OPTR,e)!='=')

{

if (!In((char)c,op)) //不是运算e符进栈

{

while(!In((char)c,op)) //可以是几位数

{

t = t*10+(c-48);

c = (float)getchar();

}

Push(OPND,t);

t = 0;

} else

{

switch (Precede((char)GetTop(OPTR,e),(char)c))

{

case ''://栈顶元素优先权低

Push(OPTR,c);

c = (float)getchar();

break;

case '='://脱括号并接受下个字符

ElemType x;

Pop(OPTR,x);

c = (float)getchar();

break;

case ''://退栈并将运算结果入栈

ElemType b,theta,a;

Pop(OPTR,theta);

Pop(OPND,b);

Pop(OPND,a);

Push(OPND,Operate(a,theta,b));

break;

case 'E':

printf("括号不匹配!!\n");

exit(0);

break;

}

}

}

ElemType tem = GetTop(OPND,e);

DestroyStack(OPND);

DestroyStack(OPTR);

return tem;

}/***

*DynaSeqStack.cpp - 动态顺序栈,即栈的动态顺序存储实现

****/

const int STACK_INIT_SIZE = 100; // 初始分配的长度

const int STACKINCREMENT = 10; // 分配内存的增量

/*------------------------------------------------------------

操作目的: 初始化栈

初始条件: 无

操作结果: 构造一个空的栈

函数参数:

SqStack *S 待初始化的栈

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool InitStack(SqStack *S)

{

assert(S != NULL);

S-base = (ElemType *)malloc(sizeof(ElemType) * STACK_INIT_SIZE);

if(S-base == NULL) return false; S-top = S-base;

S-stacksize = STACK_INIT_SIZE; return true;

}/*------------------------------------------------------------

操作目的: 销毁栈

初始条件: 栈S已存在

操作结果: 销毁栈S

函数参数:

SqStack *S 待销毁的栈

返回值:

------------------------------------------------------------*/

void DestroyStack(SqStack *S)

{

assert(S != NULL); free(S-base);

S-top = S-base = NULL;

}/*------------------------------------------------------------

操作目的: 判断栈是否为空

初始条件: 栈S已存在

操作结果: 若S为空栈,则返回true,否则返回false

函数参数:

SqStack S 待判断的栈

返回值:

bool 是否为空

------------------------------------------------------------*/

bool StackEmpty(SqStack S)

{

assert((S.base != NULL) (S.top != NULL));

return(S.base == S.top);

}/*------------------------------------------------------------

操作目的: 得到栈的长度

初始条件: 栈S已存在

操作结果: 返回S中数据元素的个数

函数参数:

SqStack S 栈S

返回值:

int 数据元素的个数

------------------------------------------------------------*/

int StackLength(SqStack S)

{

assert((S.base != NULL) (S.top != NULL));

return(S.top-S.base);

}/*------------------------------------------------------------

操作目的: 得到栈顶元素

初始条件: 栈S已存在

操作结果: 用e返回栈顶元素

函数参数:

SqStack S 栈S

ElemType *e 栈顶元素的值

返回值:

bool 操作是否成功

------------------------------------------------------------*/

ElemType GetTop(SqStack S, ElemType *e)

{

assert((S.base != NULL) (S.top != NULL));

if(StackEmpty(S)) return false; *e = *(S.top-1);

return *e;

}/*------------------------------------------------------------

操作目的: 遍历栈

初始条件: 栈S已存在

操作结果: 依次对S的每个元素调用函数fp

函数参数:

SqStack S 栈S

void (*fp)() 访问每个数据元素的函数指针

返回值:

------------------------------------------------------------*/

void StackTraverse(SqStack S, void (*fp)(ElemType))

{

assert((S.base != NULL) (S.top != NULL));

for(; S.baseS.top; S.base++) (*fp)(*S.base);

}/*------------------------------------------------------------

操作目的: 压栈——插入元素e为新的栈顶元素

初始条件: 栈S已存在

操作结果: 插入数据元素e作为新的栈顶

函数参数:

SqStack *S 栈S

ElemType e 待插入的数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool Push(SqStack *S, ElemType e)

{

if (S-top - S-base=S-stacksize)

{

S-base = (ElemType *)realloc(S-base,(S-stacksize + STACKINCREMENT) * sizeof(ElemType));

if (!S-base)

exit(0);

S-top = S-base + S-stacksize;

S-stacksize += STACKINCREMENT;

}

*S-top++ = e; return true;

}/*------------------------------------------------------------

操作目的: 弹栈——删除栈顶元素

初始条件: 栈S已存在且非空

操作结果: 删除S的栈顶元素,并用e返回其值

函数参数:

SqStack *S 栈S

ElemType *e 被删除的数据元素值

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool Pop(SqStack *S, ElemType *e)

{

if(S == NULL) return false;

assert((S-base != NULL) (S-top != NULL));

if(StackEmpty(*S)) return false; *e = *(--S-top);

return true;

}//////菜单///////

void Menu()

{

printf("表达式求值模拟程序\n\n");

printf("功能菜单:\n");

printf("==============\n");

printf("[1] 输入表达式并求值\n");

printf("[0] 退出 \n");

printf("==============\n");

printf("请输入你的选择(0~1)(以回车结束):");

}///////// 主函数 ///////////

//////////////////////////////

int main()

{

char ch = ' ',tp; do

{

system("cls");

Menu();

ch = getchar();

if (ch == '0')

break;

tp = getchar();

printf("请输入一个表达式(最后输入”=“,然后回车出结果):");

printf("这个表达式结果为:%g\n",EvaluateExpression());

tp = getchar();

printf("任意键继续...");

getch();

} while (true); return 0;

}//end

算术表达式求值 C语言

cludeiostream.h

//#define MaxLen 100//存储空间

int tran(char str[], char expr[]) //将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)//原来表达式,后缀表达式

{

int st[100]; //转化过程使用的过度栈

char ch;

int i=0,exindex=0,stindex=-1; //i是str下标,exindex是expr下标,stindex是st下标

while((ch=str[i++])!='\0')

{

if(ch='0' ch='9') //判断是数字

{

expr[exindex]=ch; //压栈

exindex++; //栈顶指针上移

while((ch=str[i++])!='\0' ch='0' ch='9') //其它位依次入栈

{

expr[exindex]=ch;

exindex++;

}

i--; //str原算术表达式栈向下遍历

expr[exindex]='#'; //以特殊字符“#”表示结束

exindex++;

}

else if(ch=='(') //判断为左括号

{

stindex++;

st[stindex]=ch;

}

else if(ch==')') //判断为右括号

{

while (st[stindex]!='(')

{

expr[exindex]=st[stindex];

stindex--; //依次弹出

exindex++;

}

stindex--;//'('出栈

}

else if(ch=='+' || ch=='-')//判断为加减号

{

while(stindex=0 st[stindex]!='(')

{

expr[exindex]=st[stindex];

stindex--;

exindex++;

}

stindex++;

st[stindex]=ch;

}

else if (ch=='*' || ch=='/')//判断为乘除号

{

while(st[stindex]=='*' || st[stindex]=='/')

{

expr[exindex]=st[stindex];

stindex--;

exindex++;

}

stindex++;

st[stindex]=ch;

}

}

while (stindex=0)//将栈中所有运算符依次弹出存入expr栈中

{

expr[exindex]=st[stindex];

exindex++;

stindex--;

}

expr[exindex]='\0';

return 1;

}

int compvalue(char expr[],int *n)

{

int st[100],d; //st为数栈

char ch;

int exindex=0,stindex=-1; //exindex是expr下标,stindex是st的下标

while((ch=expr[exindex++])!='\0')

{

if(ch='0'ch='9')//将数字字符转换成数字

{

d=0;

do

{

d=10*d+ch-'0';

}

while((ch=expr[exindex++])!='#');

stindex++;

st[stindex]=d;//数字进栈

}

else//运算符操作

{

switch(ch)

{

case'+':st[stindex-1]=st[stindex-1]+st[stindex];

break;

case'-':st[stindex-1]=st[stindex-1]-st[stindex];

break;

case'*':st[stindex-1]=st[stindex-1]*st[stindex];

break;

case'/':

if(st[stindex]!=0)

{ st[stindex-1]=st[stindex-1]/st[stindex]; }

else return 0; //除0错误!

break;

}

stindex--;

}

}

(*n)=st[stindex];

return 1;

}

void main()

{

char str[100]; //存储原来算术表达式

char expr[100]; //存储转换成的后缀表达式

int n;

cout"输入算术表达式:"endl;

cinstr;

if(tran(str,expr)==0)

{

cout"原算术表达式不正确!"endl;

}

else

{

cout"转换成后缀表达式输出:"endlexprendl;

if(compvalue(expr,n)==1)

{

cout"表达式求值:"endlnendl;

}

else

{

cout"计算错误!"endl;

}

}

如何用C语言数据结构的格式实现简单的算术表达式求值程序

用栈把中缀表达式(输入的式子)按优先级转为后缀表达式(逆波兰式,即运算符在前,操作数在后),再利用栈变计算边保存结果用于下一步计算,最后算出式子的答案

以下代码输入一个式子(以

=

作为输入结束标志),输出结果,负数如-3用0-3表示,支持高位运算

#include

stdio.h

#include

stdlib.h

#include

math.h

#include

malloc.h

#define

OK

1

#define

ERROR

-1

typedef

char

SElemType;

typedef

char

Status;

#define

STACK_INIT_SIZE

100000

#define

STACKINCREMENT

2

struct

SqStack

{

SElemType

*base;

SElemType

*top;

int

stacksize;

};

struct

SqStack1

{

int

*base;

int

*top;

int

stacksize;

};

SqStack

OPTR;

SqStack1

OPND;

char

Precede(char

c1,char

c2)

{

if(c1=='+'

||

c1=='-')

{

if(c2=='+'

||

c2=='-'

||

c2==')'

||

c2=='=')

return

'';

else

return

'';

}

else

if(c1=='*'

||

c1=='/')

{

if(c2=='(')

return

'';

else

return

'';

}

else

if(c1=='(')

{

if(c2==')')

return

'=';

else

return

'';

}

else

if(c1==')')

return

'';

else

if(c1=='=')

{

if(c2=='=')

return

'=';

else

return

'';

}

else

return

'\0';

}

int

In(char

c)

{

if(c=='+'

||

c=='-'

||

c=='*'

||

c=='/'

||

c=='('

||

c==')'

||

c=='=')

return

1;

else

return

0;

}

int

Operrate(int

m,char

b,int

n)

{

switch(b)

{

case

'+':return

m+n;

case

'-':return

m-n;

case

'*':return

m*n;

case

'/':return

m/n;

}

return

0;

}

//操作数

int

InitStack1(SqStack1

S)

{

S.base=(int

*)malloc(STACK_INIT_SIZE*sizeof(int));

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return

OK;

}

int

Push1(SqStack1

S,int

e)

{

if(S.top-S.base=S.stacksize)

{

S.base=(int

*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));

S.top=S.base+S.stacksize;

S.stacksize=S.stacksize+STACKINCREMENT;

}

*S.top++=e;

return

OK;

}

int

Pop1(SqStack1

S,int

e)

{

if(S.top==S.base)

return

ERROR;

e=*

--S.top;

return

OK;

}

int

GetTop1(SqStack1

S)

{

if(S.top==S.base)

return

ERROR;

return

*(S.top-1);

}

//算符

int

InitStack(SqStack

S)

{

S.base=(SElemType

*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return

OK;

}

int

Push(SqStack

S,SElemType

e)

{

if(S.top-S.base=S.stacksize)

{

S.base=(SElemType

*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

S.top=S.base+S.stacksize;

S.stacksize=S.stacksize+STACKINCREMENT;

}

*S.top++=e;

return

OK;

}

int

Pop(SqStack

S,SElemType

e)

{

if(S.top==S.base)

return

ERROR;

e=*

--S.top;

return

OK;

}

Status

GetTop(SqStack

S)

{

if(S.top==S.base)

return

ERROR;

return

*(S.top-1);

}

int

Calculate()

{

char

c,theta,p;

int

a,b,i=0,ans,x;

InitStack(OPTR);

Push(OPTR,'=');

InitStack1(OPND);

c=getchar();

while(c!='='

||

GetTop(OPTR)!='=')

{

if(!In(c)

c='0'

c='9')

{

Push1(OPND,c-'0');

c=getchar();

while(c='0'

c='9')

{

Pop1(OPND,x);

Push1(OPND,x*10+c-'0');

c=getchar();

}

}

else

if(In(c))

{

switch(Precede(GetTop(OPTR),c))

{

case

'':

Push(OPTR,c);

c=getchar();

break;

case

'=':

Pop(OPTR,p);

c=getchar();

break;

case

'':

Pop(OPTR,theta);

Pop1(OPND,b);

Pop1(OPND,a);

ans=Operrate(a,theta,b);

Push1(OPND,ans);

break;

}

}

else

{

c=getchar();

}

}

return

GetTop1(OPND);

}

int

main()

{

int

ans;

ans=Calculate();

printf("%d\n",ans);

return

0;

}