数据结构课程设计报告
设计题目:
算术表达式的求解
学生姓名:
专 业:
计算机科学与技术
班 级:
学 号:
完成日期:
2011 年 12 月 24 日
合肥工业大学计算机与信息学院
1
(一) 需求和规格说明
设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及
SQR和ABS函数的任意整型表达式进行求解。
要求:要检查有关运算的条件,并对错误的条件产生报警。
(二) 设计目的
1. 调研并熟悉表达式求解的基本功能、数据流程与工作规程;
2. 学习编译原理、基于 VC++集成环境的编程技术;
3. 通过实际编程加深对基础知识的理解,提高实践能力;
4. 学习开发资料的收集与整理,并学会撰写课程设计报告。
(三) 设计方案
本程序采用的是将中缀表达式转化为后缀表达式的方法进行求解。
1. 中缀表达式转换为后缀表达式的算法思想:
·建立一个栈 s;
·对中缀表达式开始扫描;
·数字时,加入后缀表达式;
·运算符:
a. 若为最高级的运算符,入栈;
b. 若为 '(',入栈;
c. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出
现'(',从栈中删除'(' ;
d. 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于
(小于,低于或等于)它的运算符(或 '(',但优先满足前一个条件)之间的运
算符加入后缀表达式中,该运算符再入栈;
·当扫描的中缀表达式结束时,栈中的的所有运算符出栈。
2. 运用后缀表达式进行计算的具体做法:
建立一个栈 r。从左到右读后缀表达式,如果读到操作数就将它压入栈 r
中,如果读到 n 元运算符(即需要参数个数为 n 的运算符)则取出由栈顶向下的 n
项按操作符运算,再将运算的结果代替原栈顶的 n 项,压入栈 r 中 。如果后缀
表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。
2
流程图:
开始
输入表达式
扫描并判断扫
描是否结束
N
Y
a[i]是否为数字
Y
N
通过转换并存
入 que rc
若为最高级的运算符,入栈;若为 '(',
入栈;若为 ')',则依次把栈中的的运算
符加入后缀表达式中,直到出现'(',从栈
中删除'(' ;若为不是最高级的运算符,
则将从栈顶到第一个优先级不大于它的
运算符之间的运算符加入后缀表达式
中,该运算符再入栈
i++
调用 stai r 存放好
的后缀表达式
后 缀 表 达 式结 果 的 计
算 result()
输出运算结果
结束
3
(四)运行实例
(五)面对的问题
只能进行正整数的一些简单的四则运算和次方运算,不能接受负数及
abs,log,sqrt,sin,cos 等函数。同时,在编写的过程中,若能模仿计算器的输
入界面进行数值和运算符的输入,则更能体现出本次课程设计的设计要求和使用
者的需要。
代码部分:
#include
#include
#define max 100000000;
using namespace std;
int isp(char c){//栈内符号的优先级
switch (c){
4
int icp(char c){//栈外符号的优先级
case '(':return 1;
case '[':return 1;
case '*':return 5;
case '/':return 5;
case '^':return 6;
case '+':return 3;
case '-':return 3;
case ')':return 8;
case ']':return 8;
}
}
switch (c){
case '(':return 8;
case '[':return 8;
case '*':return 4;
case '/':return 4;
case '^':return 7;
case '+':return 2;
case '-':return 2;
case ')':return 1;
case ']':return 1;
}
}
char a[100];
char c[100];
class stac{//符号栈
private:
char s[100];
int t;
public:
if(t==0) return 1;
else return 0;
stac(){
t=0;
}
int empty(){
}
char pop(){
if(t>0){
t--;
return s[t];
}
5
}
void push(char c){
s[t]=c;
t++;
}
char gettop(){
return s[t-1];
}
};
public:
int s[100];
int t;
stai(){
t=0;
}
int empty(){
class stai{//后缀表达式转换和计算
private:
if(t==0) return 1;
else return 0;
}
int pop(){
if(t>0){
t--;
return s[t];
}
}
void push(int c){
s[t]=c;
t++;
}
int gettop(){
return s[t-1];
}
};
class que{
private:
int s[100];
int b;
int t;
public:
que(){
6
t=0;
b=0;
}
int empty(){
}
int pop(){
if(b!=t){
if(t==0) return 1;
else return 0;
b=(b+1)%100;
return s[(b+99)%100];
}
}
void push(int c){
s[t]=c;
t=(t+1)%100;
}
int gettop(){
return s[b];
}
void clean(){
b=0;
t=0;
}
};
que rc;
void mtof (){//对表达式进行扫描并入栈
stac s;
int j=0;
int tm=0;
for(int i=0;i
}
i++;
}
else{
s.push(a[i]);
i++;
}
else{
if(s.empty()||icp(a[i])>isp(s.gettop())) {
while(icp(a[i])