当前位置:文档之家› 【数据结构与数据库-实验报告】表达式求值(栈)

【数据结构与数据库-实验报告】表达式求值(栈)


8 / 20
版权归原作者 Amber 所有
break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
6 / 20
版权归原作者 Amber 所有
case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } 8、返回操作数的长度 int num(int n) { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } 9、主要操作函数 int EvalExpr() { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') {
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学

表达式求值 (栈)
系 化学与材料科学学院 化学物理系 名 号
***** ********** 司 虎 2011 年 12 月 5 日 星期三
指导老师 提交时间
1 / 20
版权归原作者 Amber 所有
一 实验内容
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。
二 目的与要求
掌握栈的数据结构和基本操作,实现中缀算术表达式四则计算。
三 实验算法
1、定义全局变量 Stack OPTR;/* 定义运算符栈*/ Stack2 OPND; /* 定义操作数栈 */ char expr[255] = ""; /* 存放表达式串 */ char *ptr = expr; 2、构造运算符栈 int InitStack(Stack *s) { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } 3、构造操作数栈 int InitStack2(Stack2 *s) { 2 / 20
int InitStack(Stack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int InitStack2(Stack2 *s) //构造操作数栈 { s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE;
5 / 20
版权归原作者 Amber 所有
case '(' : i=4;break; case ')' : i=5;break; case '#' : i=6;break; }
switch(c2) { /* j 为下面 array 的纵标 */ case '+' : j=0;break; case '-' : j=1;break; case '*' : j=2;break; case '/' : j=3;break; case '(' : j=4;break; case ')' : j=5;break; case '#' : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ } 7、操作函数 int Operate(int a,char op,int b) { switch(op) {
五 实验结果与分析
上述程序在 Visual C++ 6.0 环境下加以实现。经过多次测试,程序运 行正确。结果如图: 10 / 20
版权归原作者 Amber 所有
11 / 20
版权归原作者 Amber 所有
六 心得体会
1、这次课程设计让我了解到大一学到的 C 语言与本学期学到的数据结构紧 密相关。 2、课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计 者有较强的思维和动手能力和更加了解编程思想和编程技巧。
4 / 20
版权归原作者 Amber 所有
{ int p=*(s.top-1); return p; } 6、判断运算符优先权,返回优先权高的运算符 char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='}; switch(c1) { ቤተ መጻሕፍቲ ባይዱ* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break; case '/' : i=3;break;
四 程序结构
1、数据结构 typedef struct{ int stacksize; char *base; char *top; 9 / 20 // 定义字符类型栈
版权归原作者 Amber 所有
} Stack; typedef struct{ int stacksize; int *base; int *top; } Stack2; 2、函数功能说明 int InitStack(Stack *s) //构造运算符栈 int InitStack2(Stack2 *s) //构造操作数栈 int In(char ch) //判断字符是否是运算符,运算符即返回 1 int Push(Stack *s,char ch) //运算符栈插入 ch 为新的栈顶元素 int Push2(Stack2 *s,int ch)//操作数栈插入 ch 为新的栈顶元素 char Pop(Stack *s) //删除运算符栈 s 的栈顶元素,用 p 返回其值 int Pop2(Stack2 *s)//删除操作数栈 s 的栈顶元素,用 p 返回其值 char GetTop(Stack s)//用 p 返回运算符栈 s 的栈顶元素 int GetTop2(Stack2 s) //用 p 返回操作数栈 s 的栈顶元素 char Precede(char c1,char c2) //判断运算符优先权,返回优先权高的 int Operate(int a,char op,int b) //操作函数 int num(int n)//返回操作数的长度 int EvalExpr()//主要操作函数 //定义整型栈
七 实验源程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NULL 0 #define OK 1 #define ERROR -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /* 定义字符类型栈 */ typedef struct{ int stacksize; char *base; char *top; } Stack; /* 定义整型栈 */ typedef struct{ 12 / 20
相关主题