一、目标
(一)问题描述
在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以中缀式字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-、*、/,用#表示结束。
算法输出:表达式运算结果。
提示:参考上课时讲的如何得到后缀式(栈处理及分析操作符优先关系),再对后缀算术表达式求值就容易了。
(二)问题分析
此课程设计的目的就是实现算术表达式的求值。为了更好地实现程序与用户之间的交互作用,我采用MFC程序设计来做此课程设计。用MFC的图形界面和鼠标来实现输入和输出(下面将会详细的描述)。
(三)需求分析
(1)能够运算整数、浮点数等基本数据类型(也就是说可以进行小数运算)。
(2)能够实现一定的报错功能。
(3)能够实现撤销上一步操作的功能(也就是说,当你输入错误的时候可以重新的输入)。
(4)实现表达式的输入、计算、输出的功能。
二、概要设计
(一)设计思想
此程序主要运用栈的存储结构,此外,我用CString类来存储算术表达式。我利用两个栈,一个为运算符栈operatorstack,一个为运算数栈operandstack,得到输入表达式后,从左到右扫描式子,若为运算数,压入operandstack,运算符则先与栈operatorstack栈顶元素进行优先级比较,若小于栈顶元素,则弹出该栈顶元素,并从栈operandstack中弹出两个操作数进行计算,结果压入operandstack中。
三、详细设计
(一)源程序
(1)、栈的实现(#include”stack1.h”)
#include<iostream>
using namespace std;
template<class T>
class Stack
{public:
T *data;
int maxSize;
int top;
public:
Stack(int n)
{
data=new T[n];
if(data==NULL)
{cout<<"overflow!/n";exit(1);}
maxSize=n;
top=-1;
}
Stack(){}
~Stack()
{
cout<<"Destroy!"<<endl;
}
//创建空栈
void SetStack(int n);
//栈存在则栈被销毁
void FreeStack();
//栈存在则返回栈的元素个数,即栈的长度
int StackSize();
//判断栈是否为空
bool StackEmpty();
//判断栈是否为满
bool StackFull();
//栈存在且非空则返回栈的栈顶元素
T Peek();
//栈存在则插入元素item为新的栈顶元素
void Push(T item);
//栈 存在且非空则删除栈的栈顶元素并用e返回其值
T Pop();
//栈存在则清为空栈
void ClearStack();
void PrintStack();
};
//顺序栈的实现stack1.cpp
//#include "stack1.h"
template<class T>
void Stack<T>::SetStack(int n)
{data=new T[n];
if(data==NULL)
{cout<<"overflow!/n";exit(1);}
maxSize=n;
top=-1;
}
template<class T>
void Stack<T>::FreeStack()
{free(data);}
template<class T>
int Stack<T>::StackSize()
{return(top+1);}
template<class T>
bool Stack<T>::StackEmpty()
{if(top==-1) return true;
return false;
}
template<class T>
bool Stack<T>::StackFull()
{if(top==maxSize-1)
return true;
return false;
}
template<class T>
T Stack<T>::Peek()
{if(top==-1)
{cerr<<"栈已空!/n";exit(1);exit(1);}