数据结构实验---堆栈
Dr[1]='\0'; //Dr变为字符串
strcat(Tempdata,Dr); //将两个字符串相接
c++; //指向下一个字符
if(In(*c,OPSET)){ //是运算符则执行
data=(float)atof(Tempdata);//字符串转化为浮点数
OPND.push(data); //将数据压入操作数堆栈OPND
if(e=='(') {
mystack.pop;//若e是字符'('则栈顶元素出栈
break;
}
else{ //若e不是字符'('则marth=ERROR
marth=ERROR;
break;
}
}
};break;
case']': //是字符']'
if(mystack.top()==0) //堆栈mystack栈顶是否为空
}
retuห้องสมุดไป่ตู้n 0;
}
//基于运算符优先关系并非返回比较结果符
char precede(char Aop, char Bop)
{
return prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}
//执行表达式求值函数
float Evaluate(char* Exp){
case '*':return (a*b);
case '/':return (a/b);
default :return 0;
}
}
Status In(char Test,char* TestOp) //判断输入字符是否为运算符
{
bool find=false; //布尔变量判断
for (int i=0; i < OPSETSIZE; i++)
#include <cstdio>
#include <stack>
using namespace std;
#define OK 0
#define ERROR -1
#define OVERFLOW -1
#define STACK_INIT_SIZE 100 //初始分配栈空间
#define STACKINCREMENT 10 //栈空间分配增量
c=Exp; //cp指向表达式
strcpy(Tempdata,"\0"); //让Tempdata变成一个字符串;
while (*c != '#' || OPTR.top() != '#'){ //遇到两个'#',表达式求值完毕
if (!In(*c,OPSET)){ //不是运算符则执行
Dr[0]=*c; //该字符放入Dr
scanf("%s",&EXP);
result=Evaluate(EXP); //执行表达式运算
printf("运算结果:%.4f\n",result);
printf("\n");
}
---------------------------------------------------------------------------------------------------------------
1、学习堆栈例程代码
2、学习后缀表达式计算的例程,掌握C++自带的STL栈的应用方法
3、根据实验要求,分析例程中关键代码的功能,进行代码说明
4、根据实验要求,尝试使用STL栈编写程序实现新功能,进行代码分析和结果说明。
二、方法、步骤:
1、阅读表达式例程,完成以下代码分析
a)对变量定义区的变量,说明它们的含义
/*****************函数实现*********************/
float Operate(float a,unsigned theta,float b) //运算函数
{
switch(theta){
case '+':return (a+b);
case '-':return (a-b);
mystack.push(exp[i]);break;
case')': //是字符')'
{
if(mystack.top()==0) //堆栈mystack栈顶是否为空
{
marth=ERROR; //空则marth=ERROR
break;
}
else
{ e=mystack.top(); //把栈顶元素赋给变量e
StackChar OPTR; //定义一个堆栈类对象用来存放操作符
StackFloat OPND; //定义一个堆栈类对象用来存放操作数
char Tempdata[20];
float data,a,b,r; //用作中间变量
char theta,*c,Dr[2]; //用作中间变量
OPTR.push('#'); //符号栈底压入‘#’
unsigned char prior[7][7] = { //定义运算符的优先级
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
char OPSET [OPSETSIZE]={'+' , '-' , '*' , '/' , '(' , ')' , '#'};//可能出现的运算符
char e,exp[100]; //e为中间变量,方便判断栈顶元素
int i,marth=OK; //marth作为标志符
printf("请输入有括号符的表达式:\n");
scanf("%s",exp);
mystack.push(0); //栈底赋值零,以便判断是否匹配成功:最后mystack.top()是否为零。
case '=': //如果优先级相等即遇到右括符
OPTR.pop();
c++;
break;
case '>': //优先级关系为大于,进行运算操作
theta = OPTR.top(); //栈顶运算符传递给变量theta
OPTR.pop(); //弹出栈顶运算符
b=OPND.top(); //栈顶操作数传递给变量b
strcpy(Tempdata,"\0"); //Tempdata赋予空字符以备下次使用
}
}
else{
switch (precede(OPTR.top(),*c)){ //比较运算符堆栈栈顶和刚接到运算符的优先级
case '<': //若优先级是小于则压入运算符
OPTR.push(*c);
c++;
break;
#define OPSETSIZE 7
typedef int Status;
typedef stack<char>StackChar; //用新的类名字StackCharr定义为Char类型
typedef stack<float> StackFloat; //用新的类名字StackFloat定义为Float类型
#define ERROR 0
typedef stack<char>StackChar; //用新的类名字StackCharr定义为Char类型
/******************主函数**************************/
int main()
{
StackChar mystack; //建立堆栈
return OPND.top(); //返回表达式计算结果
}
/******************主函数**************************/