《堆栈计算器实验报告.doc》由会员分享,可在线阅读,更多相关《堆栈计算器实验报告.doc(8页珍藏版)》请在三一办公上搜索。
1、一、实验目的本次实验为了学习用基本的数据结构解决实际应用中的问题,将学习的理论知识应用于实践,增强解决实际问题的能力。学会利用栈结构,按照算术运算优先级顺序,实现基本算术表达式的运算过程。二、实验要求功能要求:要求使用堆栈实现算术表达式的求值功能。数据结构要求:使用两个工作栈,一个为OPTR,用于寄存运算符;另一个为OPND,用于寄存操作数和运算结构。数据要求:输入:操作数栈的数据为整型,运算符栈的数据位字符型 输出:整型数据三、设计实现数据结构设计:设置两个栈,一个为操作数栈opnd,一个为运算符栈optr。输入的表达式,遇到如果是操作数就压入到操作数堆栈中,如果是运算符就将优先级与当前堆栈
2、运算符的优先级比较,谁的优先级数大就压入堆栈,否则将栈顶运算符弹出来进行运算。程序流程设计:定义链栈,判断运算符优先级,实现具体计算,错误处理、算法流程:主功能程序代码实现:#include stdafx.h#include stdlib.h#include math.h#include string.h#include conio.h#include iostream.h#include float.hstruct optr /存放操作符的栈char * base;char* top;int size;struct opnd /存放操作数的栈 int* base;int* top;int s
3、ize;void InitStack(struct optr* s)/申请操作符栈的空间及长度s-base = (char*)malloc(100*sizeof(char);s-top = s-base;s-size =100;void InitStack(struct opnd* s)/申请操作数栈的空间及长度s-base = (int*)malloc(100*sizeof(int);s-top = s-base;s-size =100;struct optr* Push(struct optr* stack , char opp)/插入操作符opp*stack-top = opp;stac
4、k-top+;return stack;struct opnd* Push(struct opnd* stack , int num , int i)*stack-top = num;stack-top+;return stack;char GetTop(struct optr* stack)/取栈顶元素return *(stack-top-1);int GetTop(struct opnd * stack) /取栈顶元素return *(stack-top-1);char PreCede(char oldChar , char newChar)int oldInt;int newInt;sw
5、itch (oldChar)case +:oldInt = 4;break;case -:oldInt = 4;break;case *:oldInt = 6;break;case /:oldInt = 6;break;case (:oldInt = 2;break;case ):oldInt = 7;break;case =:oldInt = 0;break;switch (newChar)case +:newInt = 3;break;case -:newInt = 3;break;case *:newInt = 5;break;case /:newInt = 5;break;case (
6、:newInt = 7;break;case ):newInt = 2;break;case =:newInt = 0;break;if(oldInt newInt)return ; if(oldInt newInt)return ;if(oldInt = newInt)return =;int Add(int a , int b)return (a+b);int minute(int a ,int b)return (a-b);int multiply (int a ,int b)return (a*b);int division (int a,int b)return (a/b);int
7、Operate(int a , char theta ,int b)switch (theta)case +:return Add(a,b);case -:return minute(a ,b);case *:return multiply(a,b);case /:return division(a,b);int main(int argc, char* argv)char a80; /建立一个字符串用来存放表达式char temp;int stringCount = 0;struct optr* stackOptr=(struct optr*)malloc(sizeof(optr);stru
8、ct opnd* stackNOpnd=(struct opnd*)malloc(sizeof(opnd);printf(请输入算数表达式); scanf(%s,a); InitStack(stackOptr);stackOpp = Push(stackOpnd,= );InitStack(stackOpnd);temp = astringCount;stringCount+;while(temp != = | GetTop(stackOpptr) != = )/如果不是等于号执行下面的操作if(!In(temp)/将输入字符转化成数字,并入栈,然后加一int value = (int)tem
9、p-48;stackNum = Push(stackOptr,value,0); coutGetTop(stackOpnd) ;temp = astringCount;stringCount= stringCount+1;elseswitch(PreCede(GetTop(stackOpnd),temp)case ;int a = (int)*(-stackOptr-top);coutGetTop(stackOpnd)top);char theta = *(-stackOpnd-top);stackOpnd = Push(stackOpnd,Operate(b,theta,a),0);cout
10、GetTop(stackOpnd)top-;temp = astringCount;stringCount+;break;printf(感谢您的使用:n);printf(n运算结果=:%dn,GetTop(stackOpnd); return 0;四、实验结果输入输出结果 1. 输入:5+2(7-4)=输出:数据栈栈顶元素:3,7,2,7,5,3,15最后结果为15五、实验总结实验结果是否合理:基本合理。心得体会: 由于我的c+平均很差,Visual stdio 2008这个平台用的很差,不会找错解错,在设计的时候遇到了很大的麻烦,但通过第一次的上机练习,我慢慢的熟用了这个平台,我明白了栈的工作原理,明白了计算表达式优先级的算法,使我这次上机,收益很深。 8