后缀表达式求值
- 格式:doc
- 大小:58.00 KB
- 文档页数:5
实验报告书
课程名:数据结构
题目:后缀表达式求值
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); // 弹出结果