后缀表达式求值_数据结构设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void stackType<Type>::pop() //出栈
{
if (!isEmptyStack())
{
stackTop--;
}
else
{
cout<<"empty!!";
}
}
template<class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack) //复制栈
数据结构课程设计
后缀表达式求值
题目:
后缀表达式求值
指导老师:
高攀
姓名:
顾力雄
学院:
信息科学与技术学院
专业:
计算机科学与技术专业
班级:
计科2008级(1)班
学号:
2008082258
时间:
2009年3月28日
课程设计报告
一、题目:后缀表达式求值;
二、设计目的
1、掌握类模板的应用
2、掌握栈的操作
3、 掌握
expressionOk=false;
}
}
}
}
void discard(istream& in,ostream& out,char& ch) //输出
{
while (ch!='=')
{
in.get(ch);
out<<ch;
}
}
int main()
{
system("color 2b");
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
{
return (stackTop==maxStackSize);
}
template<class Type>
void stackType<Type>::push(const Type& newItem) //压栈操作
{
if (!isFullStack())
{
list[stackTop]=newItem;
expressionOk=true;
cout<<ch;
while (ch!='=')
{
switch (ch)
{
case '`':cin>>num;
cout<<num<<" ";
if (!stack.isFullStack())
stack.push(num);
stackType(int stackSize=100);
stackType(const stackType<Type>& otherStack);
~stackType();
private:
int maxStackSize;
int stackTop;
Type *list;
void copyStack(const stackType<Type>& otherStack);
cout<<"┃**************★☆二、退出系统☆★**************┃";
cout<<"┃**************★输入‘Q’或‘q’退出系统★**************┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
long double num,result;
bool expressionOk;
char ch;
stackType<long double> stack(100);
cout<<"请输入后缀表达式:"<<endl;
cin>>ch;
while (ch!='q' && ch!='Q')
{
stack.initializeStack();
#include<iostream>
#include<cassert>
using namespace std;
template<class Type> //用模板实现的链式结构堆栈类
class stackType
{
public:
const stackType<Type> & operator=(const stackType<Type>&);
{
out<<"(没有足够的数)";
expressionOk=false;
}
else
{
op2=stack.top();
stack.pop();
switch (ch)
{
case '~':stack.push(sqrt(op2));
return;
case 's':stack.push(sin(op2));
cout<<"┃**************★6输入‘C’表示arccos★**************┃";
cout<<"┃**************★7输入‘t’表示arctan★**************┃";
cout<<"┃**************★8输入‘%’表示取余★**************┃";
三、设计内容和要求
四、 运用栈模板在求值过程顺序扫描后缀表达式,每次遇到操作数便将它压入堆栈;遇到运算符,则从栈中弹出两个操作数进行计算,然后再把结果压入堆栈,等到扫描结束时,输出结果,有加减乘除、平方根、sin、cos、tan、arcsin、arcos、arctan、取余、幂运算等等算术。
五、 程序结构
(const stackType<Type>& otherStack)
{
if (this!=&otherStack)
{
copyStack(otherStack);
}
return *this;
}
#endif
主文件:
#include<iostream>
#include<iomanip>
#include<cmath>
{
stackTop=0;
}
template<class Type>
bool stackType<Type>::isEmptyStack() const //判断栈空
{
return (stackTop==0);
}
template<class Type>
bool stackType<Type>::isFullStack() const //判断栈满
cout<<"┃**************★9输入‘^’表示x的y次幂★**************┃";
cout<<"┃**************★10输入数字前请加“`”符号★**************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
{
maxStackSize=stackSize;
stackTop=0;
list=new Type[maxStackSize];
assert(list!=NULL);
}
}
template<class Type>
stackType<Type>::~stackType() //释放栈
{
delete [] list;
stackTop++;
}
else
{
cout<<"full!!";
}
}
template<class Type>
Type stackType<Type>::top() const//栈顶元素
{
assert (stackTop!=0);
return list[stackTop-1];
}
template<class Type>
return;
case 'T':stack.push(atan(op2));
return;
}
if (stack.isEmptyStack())
{
out<<"(没有足够的数)";
expressionOk=false;
}
else
{
op1=stack.top();
stack.pop();
switch (ch)
{
case '+':stack.push(op1 + op2);
break;
case '-':stack.push(op1 - op2);
break;
case '*':stack.push(op1 * op2);
break;
case '/':
if (wk.baidu.comp2!=0)
stack.push(op1 / op2);
else
{
out<<"(用0除)";
expressionOk=false;
}
break;
case '^':stack.push(pow(op1,op2));
break;
case '%':stack.push(int(op1) % int(op2));
break;
default:out<<"(错误的运算符)";
return;
case 'c':stack.push(cos(op2));
return;
case 't':stack.push(tan(op2));
return;
case 'S':stack.push(asin(op2));
return;
case 'C':stack.push(acos(op2));
};
//类模板成员函数的实现
template<class Type>//构造函数
void stackType<Type>::initializeStack()
{
stackTop=0;
}
template<class Type>
void stackType<Type>::destroyStack()//清空栈
{
list[j]=otherStack.list[j];
}
}
template<class Type>
stackType<Type>::stackType(int stackSize) //设定栈的长度
{
if (stackSize<=0)
{
cout<<"!!!";
maxStackSize=100;
}
else
cout<<"┃**************★☆一、输入提示☆★**************┃";
cout<<"┃**************★1输入‘~’表示平方根★**************┃";
cout<<"┃**************★2输入‘s’表示sin★**************┃";
}
template<class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
list=NULL;
copyStack(otherStack);
}
template<class Type>
const stackType<Type>& stackType<Type>::operator=
{
delete [] list;
maxStackSize=otherStack.maxStackSize;
stackTop=otherStack.stackTop;
list=new Type[maxStackSize];
assert(list!=NULL);
for (int j=0;j<stackSize;j++)
五、运行图
参考文献:
刘振鹏编,数据结构(第二版),北京铁道出版社,2007.;
谭浩强编,C++程序设计,北京,清华大学出版社,2004.;
徐晓凯编,数据结构实用教程,第二版,北京,清华大学出版社。
附录:源文件
头文件myStack.h:
#ifndef H_StackType
#define H_StackType
cout<<"┃**********★★★★★★★★★★★★★★★★★**********┃";
cout<<"┃**************☆感谢您使用后缀表达式求值程序☆**************┃";
cout<<"┃**************☆用户说明☆**************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
#include "myStack.h"
void evaluate(ostream& out,stackType<long double>& stack, //求值运算
char& ch,bool& expressionOk)
{
long double op1,op2;
bool one=false;
if (stack.isEmptyStack())
void initializeStack(); //构造函数
bool isEmptyStack() const;
bool isFullStack() const;
void destroyStack();
void push(const Type& newItem);
Type top() const;
void pop();
cout<<"┃**************★3输入‘c’表示cos★**************┃";
cout<<"┃**************★4输入‘t’表示tan★**************┃";
cout<<"┃**************★5输入‘S’表示arcsin★**************┃";
{
if (!isEmptyStack())
{
stackTop--;
}
else
{
cout<<"empty!!";
}
}
template<class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack) //复制栈
数据结构课程设计
后缀表达式求值
题目:
后缀表达式求值
指导老师:
高攀
姓名:
顾力雄
学院:
信息科学与技术学院
专业:
计算机科学与技术专业
班级:
计科2008级(1)班
学号:
2008082258
时间:
2009年3月28日
课程设计报告
一、题目:后缀表达式求值;
二、设计目的
1、掌握类模板的应用
2、掌握栈的操作
3、 掌握
expressionOk=false;
}
}
}
}
void discard(istream& in,ostream& out,char& ch) //输出
{
while (ch!='=')
{
in.get(ch);
out<<ch;
}
}
int main()
{
system("color 2b");
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
{
return (stackTop==maxStackSize);
}
template<class Type>
void stackType<Type>::push(const Type& newItem) //压栈操作
{
if (!isFullStack())
{
list[stackTop]=newItem;
expressionOk=true;
cout<<ch;
while (ch!='=')
{
switch (ch)
{
case '`':cin>>num;
cout<<num<<" ";
if (!stack.isFullStack())
stack.push(num);
stackType(int stackSize=100);
stackType(const stackType<Type>& otherStack);
~stackType();
private:
int maxStackSize;
int stackTop;
Type *list;
void copyStack(const stackType<Type>& otherStack);
cout<<"┃**************★☆二、退出系统☆★**************┃";
cout<<"┃**************★输入‘Q’或‘q’退出系统★**************┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
long double num,result;
bool expressionOk;
char ch;
stackType<long double> stack(100);
cout<<"请输入后缀表达式:"<<endl;
cin>>ch;
while (ch!='q' && ch!='Q')
{
stack.initializeStack();
#include<iostream>
#include<cassert>
using namespace std;
template<class Type> //用模板实现的链式结构堆栈类
class stackType
{
public:
const stackType<Type> & operator=(const stackType<Type>&);
{
out<<"(没有足够的数)";
expressionOk=false;
}
else
{
op2=stack.top();
stack.pop();
switch (ch)
{
case '~':stack.push(sqrt(op2));
return;
case 's':stack.push(sin(op2));
cout<<"┃**************★6输入‘C’表示arccos★**************┃";
cout<<"┃**************★7输入‘t’表示arctan★**************┃";
cout<<"┃**************★8输入‘%’表示取余★**************┃";
三、设计内容和要求
四、 运用栈模板在求值过程顺序扫描后缀表达式,每次遇到操作数便将它压入堆栈;遇到运算符,则从栈中弹出两个操作数进行计算,然后再把结果压入堆栈,等到扫描结束时,输出结果,有加减乘除、平方根、sin、cos、tan、arcsin、arcos、arctan、取余、幂运算等等算术。
五、 程序结构
(const stackType<Type>& otherStack)
{
if (this!=&otherStack)
{
copyStack(otherStack);
}
return *this;
}
#endif
主文件:
#include<iostream>
#include<iomanip>
#include<cmath>
{
stackTop=0;
}
template<class Type>
bool stackType<Type>::isEmptyStack() const //判断栈空
{
return (stackTop==0);
}
template<class Type>
bool stackType<Type>::isFullStack() const //判断栈满
cout<<"┃**************★9输入‘^’表示x的y次幂★**************┃";
cout<<"┃**************★10输入数字前请加“`”符号★**************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
{
maxStackSize=stackSize;
stackTop=0;
list=new Type[maxStackSize];
assert(list!=NULL);
}
}
template<class Type>
stackType<Type>::~stackType() //释放栈
{
delete [] list;
stackTop++;
}
else
{
cout<<"full!!";
}
}
template<class Type>
Type stackType<Type>::top() const//栈顶元素
{
assert (stackTop!=0);
return list[stackTop-1];
}
template<class Type>
return;
case 'T':stack.push(atan(op2));
return;
}
if (stack.isEmptyStack())
{
out<<"(没有足够的数)";
expressionOk=false;
}
else
{
op1=stack.top();
stack.pop();
switch (ch)
{
case '+':stack.push(op1 + op2);
break;
case '-':stack.push(op1 - op2);
break;
case '*':stack.push(op1 * op2);
break;
case '/':
if (wk.baidu.comp2!=0)
stack.push(op1 / op2);
else
{
out<<"(用0除)";
expressionOk=false;
}
break;
case '^':stack.push(pow(op1,op2));
break;
case '%':stack.push(int(op1) % int(op2));
break;
default:out<<"(错误的运算符)";
return;
case 'c':stack.push(cos(op2));
return;
case 't':stack.push(tan(op2));
return;
case 'S':stack.push(asin(op2));
return;
case 'C':stack.push(acos(op2));
};
//类模板成员函数的实现
template<class Type>//构造函数
void stackType<Type>::initializeStack()
{
stackTop=0;
}
template<class Type>
void stackType<Type>::destroyStack()//清空栈
{
list[j]=otherStack.list[j];
}
}
template<class Type>
stackType<Type>::stackType(int stackSize) //设定栈的长度
{
if (stackSize<=0)
{
cout<<"!!!";
maxStackSize=100;
}
else
cout<<"┃**************★☆一、输入提示☆★**************┃";
cout<<"┃**************★1输入‘~’表示平方根★**************┃";
cout<<"┃**************★2输入‘s’表示sin★**************┃";
}
template<class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
list=NULL;
copyStack(otherStack);
}
template<class Type>
const stackType<Type>& stackType<Type>::operator=
{
delete [] list;
maxStackSize=otherStack.maxStackSize;
stackTop=otherStack.stackTop;
list=new Type[maxStackSize];
assert(list!=NULL);
for (int j=0;j<stackSize;j++)
五、运行图
参考文献:
刘振鹏编,数据结构(第二版),北京铁道出版社,2007.;
谭浩强编,C++程序设计,北京,清华大学出版社,2004.;
徐晓凯编,数据结构实用教程,第二版,北京,清华大学出版社。
附录:源文件
头文件myStack.h:
#ifndef H_StackType
#define H_StackType
cout<<"┃**********★★★★★★★★★★★★★★★★★**********┃";
cout<<"┃**************☆感谢您使用后缀表达式求值程序☆**************┃";
cout<<"┃**************☆用户说明☆**************┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
#include "myStack.h"
void evaluate(ostream& out,stackType<long double>& stack, //求值运算
char& ch,bool& expressionOk)
{
long double op1,op2;
bool one=false;
if (stack.isEmptyStack())
void initializeStack(); //构造函数
bool isEmptyStack() const;
bool isFullStack() const;
void destroyStack();
void push(const Type& newItem);
Type top() const;
void pop();
cout<<"┃**************★3输入‘c’表示cos★**************┃";
cout<<"┃**************★4输入‘t’表示tan★**************┃";
cout<<"┃**************★5输入‘S’表示arcsin★**************┃";