【数据结构与数据库-实验报告】表达式求值(栈)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
七 实验源程序
#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
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) {
版权归原作者 Amber 所有
int stacksize; int *base; int *top; } Stack2; /* ----------------- 全局变量--------------- */ Stack OPTR;/* 定义运算符栈*/ Stack2 OPND; /* 定义操作数栈 */ char expr[255] = ""; /* 存放表达式串 */ char *ptr = expr;
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学
目
表达式求值 (栈)
系 化学与材料科学学院 化学物理系 名 号
***** ********** 司 虎 2011 年 12 月 5 日 星期三
指导老师 提交时间
1 / 20
版权归原作者 Amber 所有
一 实验内容
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。
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; }
版权归原作者 Amber 所有
} 5、删除运算符栈及操作数栈 s 的栈顶元素,用 p 返回其值 char Pop(Stack *s) { char p; s->top--; p=*s->top; return p; } int Pop2(Stack2 *s) { int p; s->top--; p=*s->top; return p; } 5、用 p 返回运算符栈及操作数栈 s 的栈顶元素 char GetTop(Stack s) { char p=*(s.top-1); return p; } int GetTop2(Stack2 s)
7 / 20
版权归原作者 Amber 所有
if(!In(c)) { if(!In(*(ptr-1))) ptr=ptr-1; m=atoi(ptr);//取字符串前面的数字段 n=num(m); Push2(&OPND,m); ptr=ptr+n; c=*ptr++; } else switch(Precede(GetTop(OPTR),c)) { case '<': Push(&OPTR,c); c = *ptr++; break; case '=': x=Pop(&OPTR); c = *ptr++; break; case '>': theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND); Push2(&OPND,Operate(a,theta,b));
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;
二 目的与要求
掌握栈的数据结构和基本操作,实现中缀算术表达式四则计算。
三 实验算法
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
版权归原作者 Amber 所有
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE; s->top=s->base; return OK; } 4、判断运算符并将运算符栈插入 ch 为新的栈顶元素 int In(char ch) { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#') ; } int Push(Stack *s,char ch) { *s->top=ch; s->top++; return 0; } 4、将操作数栈插入 ch 为新的栈顶元素 int Push2(Stack2 *s,int ch) { *s->top=ch; s->top++; return 0; 3 / 20
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)!='#') {
五 实验百度文库果与分析
上述程序在 Visual C++ 6.0 环境下加以实现。经过多次测试,程序运 行正确。结果如图: 10 / 20
版权归原作者 Amber 所有
11 / 20
版权归原作者 Amber 所有
六 心得体会
1、这次课程设计让我了解到大一学到的 C 语言与本学期学到的数据结构紧 密相关。 2、课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计 者有较强的思维和动手能力和更加了解编程思想和编程技巧。
13 / 20
版权归原作者 Amber 所有
s->top=s->base; return OK; }
int In(char ch) //判断字符是否是运算符,运算符即返回 1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#') ; } int Push(Stack *s,char ch) //运算符栈插入 ch 为新的栈顶元素 { *s->top=ch; s->top++; return 0; } int Push2(Stack2 *s,int ch)//操作数栈插入 ch 为新的栈顶元素 { *s->top=ch; s->top++; return 0; } char Pop(Stack *s) //删除运算符栈 s 的栈顶元素,用 p 返回其值 { char p; 14 / 20
四 程序结构
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()//主要操作函数 //定义整型栈
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;