后缀表达式求值

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

实验报告书

课程名:数据结构

题目:后缀表达式求值

1、实验题目

(1)掌握栈“后进先出”的特点。

(2)掌握栈的典型应用——后缀表达式求值。

2、实验内容

(1)用键盘输入一个整数后缀表达式(操作数的范围是0~9,运算符只含+、—、*、/、,而且中间不可以有空格),使用循环程序从左向右读入表达式。

(2)如果读入的是操作数,直接进入操作数栈。

(3)如果读入的是运算符,立即从操作数栈取出所需的操作数,计算操作数运算的值,并将计算结果存回操作数栈。

(4)检验程序运行结果。

3、实验要求

(1)分析后缀表达式求值的算法思想,用C(或C++)语音设计程序。

(2)上机调试通过实验程序。

(3)给出具体的算法分析,包括时间复杂度和空间复杂度等。

(4)撰写实验报告(把输入实验数据及运行结果用抓图的形式粘贴到实验报告上)。

(5)本程序运行结果通过以后,添加到原教材验证性实验3的菜单中去。

4、实验步骤与源程序

错误!未找到引用源。实验步骤

使用循环从左到右输入后缀表达式。如输入的是运算符,立即从操作数栈取出两个操作数,计算上述操作数和运算符的值,然后存回操作数栈。如输入的是操作数则直接存入操作数栈。

整个过程只需要一个操作数栈。

由一个链栈结点定义node、push()、pop()、empty()运算函数一个main()主函数(完成数据输入和函数调用)、

两个个功能函数:

isoperator()//判运算符

getvalue()//计算表达式值

错误!未找到引用源。源代码

#include

#include

struct node // 栈结构声明

{

int data; // 数据域

struct node *next; // 指针域

};

typedef struct node stacklist; // 链表新类型

typedef stacklist *link; // 链表指新针类型

link operand=NULL; // 操作数栈指针

void push( int value) // 进栈,存入数据

{

link newnode; // 新结点指针

newnode=new stacklist; // 分配新结点

if (!newnode)

{

printf("分配失败!"); // 存入失败

return ;

}

newnode->data=value; // 创建结点的内容

newnode->next=operand;

operand=newnode; // 新结点成为栈的开始

return ;

}

void pop(int *value) // 出栈,取出数据

{

link top; // 指向栈顶

if (operand !=NULL)

{

top=operand; // 指向栈顶

operand=operand->next; // 移动栈顶指针,指向下一个结点

*value=top->data; // 取数据

delete top; // 吸收结点

}

else

*value=-1;

}

int empty() // 判栈空

{

if (operand!=NULL) return 1;

else return 0;

}

int isoperator(char op) // 判运算符

{

switch (op)

{

case'+':

case'-':

case'*':

case'/': return 1; // 是运算符,返回

default: return 0; // 不是运算符,返回

}

}

int getvalue(int op,int operand1,int operand2) // 计算表达式值

{

switch((char)op)

{

case'*': return(operand1*operand2);

case'/': return(operand1/operand2);

case'+': return(operand1+operand2);

case'-': return(operand1-operand2);

}

}

void main() // 主函数

{

char exp[100];

int operand1=0; // 定义操作数

int operand2=0; // 定义操作数

int result=0; // 定义操作结果变量

int pos=0; // 目前表达式位置

printf("\t\n 请输入后缀表达式:");

gets(exp); //cin.getline(exp,81) // 读取后缀表达式 printf("\t\n\n 后缀表达式[%s]的结果是:",exp);

while (exp[pos] !='\0' && exp[pos] !='\n') // 分析表达式字符串

{

if (isoperator(exp[pos])) // 是运算符,取两个操作数

{

pop(&operand2);

pop(&operand1);

push(getvalue(exp[pos],operand1,operand2)); }

else

push(exp[pos]-48); // 是操作数,压入操作数栈 pos++; // 移到下一个字符串位置

}

pop(&result); // 弹出结果

相关文档
最新文档