利用栈求表达式的值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:利用栈求表达式的值

一.设计任务和目标

编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。

主要功能描述如下:

1、从键盘上输入表达式。

2、分析该表达式是否合法:

(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。

(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

主要功能描述如下:

1、从键盘上输入表达式。

2、分析该表达式是否合法:

(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。

(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

程序应包括以下几个功能函数

void initstack();初始化堆栈

int Make_str();语法检查并计算

int push_operate(int operate):将操作码压入堆栈

int push_num(double num):将操作数压入堆栈

int procede(int operate):处理操作码

int change_opnd(int operate):将字符型操作码转换成优先级

int push_opnd(int operate):将操作码压入堆栈

int pop_opnd();将操作码弹出堆栈

int caculate(interru_opnd):简单计算+,-,*,/

double pop_num():弹出操作数

程序如下:

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#define MAXLEN 100

typedef struct

{

char op;

int level;

}opt;

typedef struct //定义操作符栈

{

opt st[MAXLEN];

int top;

}op_stack;

typedef struct //定义值栈

{

double D[MAXLEN];

int top;

}D_stack;

//--------对栈操作的定义-------------

opt peek(op_stack *s) //定义看栈顶函数{

opt error=;

if(s->top>=0)

return s->st[s->top];

else

return error;

}

int IsEmpty(op_stack *s) //定义判断栈空的函数{

if(s->top<0)

return 0;

else

return s->st[s->top].op;

}

char push(op_stack *s,opt c) //定义入栈函数{

s->top++;

s->st[s->top]=c;

return c.op;

}

opt pop(op_stack *s) //定义出栈函数

{

opt i;

opt error=;

if(s->top>=0)

{

i=s->st[s->top];

s->st[s->top].op='\0';

s->top--;

return i;

}

else

return error;

}

void clear(op_stack *s) //定义初始化栈

{

s->top=-1;

}

//-----------------------------define the value stack-----------------------

double Dpeek(D_stack *s) //定义看栈顶函数{

if(s->top>=0)

return s->D[s->top];

else

return 0;

}

int DIsEmpty(D_stack *s) //定义判断栈空的函数{

if(s->top<0)

return 0;

else

return (int)(s->D[s->top]);

}

double Dpush(D_stack *s,double c) //定义入栈函数{

s->top++;

s->D[s->top]=c;

return c;

}

double Dpop(D_stack *s) //定义出栈函数

{

double i;

if(s->top>=0)

{

i=s->D[s->top];

s->D[s->top]='\0';

s->top--;

return i;

}

else return 0;

}

void Dclear(D_stack *s) //定义初始化栈{

s->top=-1;

}

double calval(char *exp)

{

op_stack os; //定义两个栈

D_stack ds;

char tmp[MAXLEN]=;

int i=0,leng;

double dtmp,dpoptmp;

相关文档
最新文档