1、数据结构课程设计带括号的算术表达式求值、实验的目的和要求1.采用算符优先数算法 , 能正确求值表达式 ;2.熟练掌握栈的应用 ;3熟练掌握计算机系统的基本操作方法 ,了解如何编辑、编译、链接和运行一个 C+程序;4.上机调试程序 ,掌握查错、排错使程序能正确运行。三、 实验的环境 :指硬件和软件环境1.硬件环境 : Intel 奔腾双核 T2390 双核处理器 (1.86GHz 主频 /1MB 二级缓存 /533MHz 前端总线 ), RAM:2G .2.软件环境 : 操作系统: windows vista编译软件: Microsoft Viual C+6.03.软件环境介绍 :Visual
2、C+是一个功能强大的可视化软件开发工具。 自1993年Microsoft公司推出VisualC+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工 具。虽然微软公司推出了 Visual C+.NET(Visual C+7.0) ,但它的应用的很大的局限性,只 适用于 Windows 2000,Windows XP 和 Windows NT4.0。所以实际中,更多的是以 Visual C+6.0 为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于 Windows操作系统的可视化集成开发环境( integrated development e
3、nvironment,IDE )。 Visual C+6.0 由许多组件组成,包 括编辑器、调试器以及程序向导 AppWizard 、类向导 Class Wizard 等开发工具。 这些组件 通过一个名为 Developer Studio 的组件集成为和谐的开发环境。四、 算法描述 :1.头文件 :Stack.hCalculator.hMethod:Stack method:Push(); / 进栈操作Pop(); / 出栈操作GetHead(); / 返回栈中的最顶层元素MakeEmpty(); / 清空栈操作Calculator method:Calculator();/ 计算主体 cel
4、arstream(); / 清空输入流Prior();/ 返回运算符的优先级 done(); / 做一次二元运算 output(); / 打印结果并输出EnEmpty(); / 调用 MakeEmpty(), 并清空栈2.cpp 文件Calculator.cppMethod:int main(); / 主程序3.程序流程图优先级比较算法Data算法存放操作字符 存放数据调用 Calculator。结束4.功能描述(1)所有函数都是在 calculator。函数为主体,调用其他函数开始的。 Calculator函数让输入的中缀表达式按字符读取。(2)如果读取为操作数,则将字符返回输入流 (cin
5、.putback),读操作数并进data栈,然后读入下一字符送入 ch。(3)如果读取为操作符,则判断操作符类型,确定优先级。不同的优先数的操作符进行 不同的运算。 用output函数进行结果等的输出。Enempty为清空两个栈。(6) 主函数调用时,创建 calculator 实例,调用 calculator 函数进行计算,然后调用 output 函数进行输出,最后调用 enempty 清空栈。注:程序有两个栈,分别为 data和sign。分别存放操作数和操作符; 此程序要求输入的是中缀表达式,即直接对中缀表达式求值 , 不用转化为后缀在求值。五、源程序清单 :Stack.h #includ
6、e #include #include #include #include #define ERROR -1 #define BLANK 0 #define DATA 1 #define KUOHAO1 5 #define KUOHAO2 2 #define ADD_OR_SUB 3 #define MUT_OR_DIV 4 const int size=500; template class Stack; template class StackNode /堆栈的结点类 friend class Stack;Elem elem;StackNode *link;StackNode (Elem
7、e=0, StackNode *l=NULL):elem(e),link(l) /coutelem is : eendl;template class Stack;template class Stackint number;StackNode *head;public:Stack():number(0),head(NULL)Stack()StackNode *tmp=head;while(head!=NULL)head=head-link;delete tmp;tmp=head;void Push(const Elem &e)number+;head=new StackNode(e, hea
8、d);void MakeEmpty()StackNode *tmp=head;while(head!=NULL) head=head-link; delete tmp; tmp=head;number=0;void Pop()assert(number!=0);number-;StackNode *tmp=head; head=head-link;delete tmp;Elem GetHead()return head-elem;int GetNumber() const return number; / 返回堆栈中元素的数目 ;Calculator.hclass Calculatorpriv
9、ate:Stack data;/ 数据栈Stack sign;/ 运算符栈int flag; / 标志位表示前一个输入的是数还是一个运算符public:Calculator()flag=BLANK;Calculator()int Prior(char ch) const/ 返回运算符的优先级switch(ch)case ):return 1;case +: case -:return 2;case *:case /:return 3;case (:return 5;default:return -1;void clearstream()/ 清空输入流char ch;while(cinch, c
10、h!=;) ;void done(char ch)/ 做一次二元运算double a, b;a=data.GetHead(); data.Pop();b=data.GetHead(); data.Pop(); switch(ch)case +:b+=a; break; case -:b-=a; break; case *:b*=a; break; case /:if(a=0) cout 除数为零 ! 返回系统默认值如下 ch, ch!=)if(ch=0 & ch=9 | ch=.)if(flag=DA TA) coutnError input! 小数点只能有一位 ! d;data.Push(d
11、);flag=DA TA;else/如果输入的是字符, 则作出判断int prio=Prior(ch);char tempch, chprior;switch( prio )case -1: coutnError input! 不允许的字符 = Prior(ch) )done( sign.GetHead() );sign.Pop();flag = ADD_OR_SUB;sign.Push( ch );break;case 3: / 如果当前输入是一个 * 或者 / 号/ 如果前一个输入是一个 * 或者 / 号/如果它前面不只一个数字, 则做它前面的运算 if(data.GetNumber()!=1)chprior=Prior(sign.GetHead();if(chprior=Prior(ch) & sign.GetHead()!=()chprior=sign.GetHead();sign.Pop(); done(chprior);sign.Push(ch);flag=MUT_OR_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1