/*栈的基本操作及实现表达式求值*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef int Status;
typedef struct {
float *base;//在栈构造之前和销毁之后,base的值为NULL
float *top;//栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack;
char sign[8]={"+-*/()#"};
//运算符之间的关系
// + - * / ( ) #
char relation[7][7]={
/* + */{'>','>','<','<','<','>','>'},
/* - */{'>','>','<','<','<','>','>'},
/* * */{'>','>','>','>','<','>','>'},
/* / */{'>','>','>','>','<','>','>'},
/* ( */{'<','<','<','<','<','=',' '},
/* ) */{'>','>','>','>',' ','>','>'},
/* # */{'<','<','<','<','<',' ','='}
};
//构造一个空栈S
Status InitStack(SqStack &S)
{
S.base = (float*)malloc(STACK_INIT_SIZE * sizeof(float));
if (!S.base)exit(OVERFLOW);//存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S)//销毁栈
{
free(S.base);
S.stacksize=0;
S.top=S.base=NULL;
return OK;
}
Status ClearStack(SqStack &S)//清空栈
{
S.top=S.base;
return OK;
}
bool StackEmpty(SqStack &S)//判断栈是否为空
{
if(S.top==S.base) return true;
return false;
}
//取栈顶元素
char GetTop(SqStack S)
{
if (S.top == S.base) return '#';
return char(*(S.top-1));
}
//插入元素e为新的栈顶元素
Status Push(SqStack &S, float e)
{
if (S.top - S.base >= S.stacksize)
{//栈满,追加存储空间
S.base = (float *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(float));
if (!S.base) exit(OVERFLOW);//存储分配失败
S.top = S.base + STACKINCREMENT;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
//删除S 的栈顶元素
float Pop(SqStack &S)
{
if(StackEmpty(S))return '#';
return *(--S.top);
}
char Precede(char a,char b)
{
int i,j;
switch(a)
{
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '#':i=6;break;
}
switch(b)
{
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '#':j=6;break;
}
return relation[i][j];
}
float Operate(float a,char opr,float b)//计算
{
if(opr=='+')return a+b;
else if(opr=='-')return a-b;
else if(opr=='*')return a*b;
else if(opr=='/')
{
if(b==0){printf("计算过程中出现了除数为0的情况!输出结果错误!\n");system("pause");}
else return a/b;
}
}
bool is_OPND(char c)//判断是否为数字
{
if((c>='0'&&c<='9' )||c=='.')return true;
return false;
}
void Getchar()
{
while(getchar()!='\n');
}
int main()
{
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,float('#'));
char c;
printf("请输入一个正确的算术表达式(用#号结束):\n");
scanf("%c",&c);
char num[20];
int Temp=1;
while(Temp)
{
while(c!='#'||GetTop(OPTR)!='#')
{
int i=0;
if(is_OPND(c))
{
num[i]=c;
while(scanf("%c",&c)&&(is_OPND(c)))
{
i++;num[i]=c;
}
float result=(float)atof(num);
Push(OPND,result);
}
else
{
switch(Precede(GetTop(OPTR),c))
{
case '<':Push(OPTR,c);scanf("%c",&c);break;
case '=':Pop(OPTR);scanf("%c",&c);break;
case '>':float b=Pop(OPND),a=Pop(OPND);
char opera=char(Pop(OPTR));
float f=Operate(a,opera,b);
Push(OPND,f);
}
}
memset(num,0,sizeof(num));
}
float output=Pop(OPND);
getchar();
printf("该算术表达式的值为:");
printf("%.2f\n",output);
printf("是否继续计算表达式?(Y/N)");
char a=getchar(); Getchar();
if(a=='Y'||a=='y')
{
ClearStack(OPTR);
ClearStack(OPND) ;
printf("请输入一个正确的算术表达式(用#结束):\n");
Push(OPTR,float('#'));
scanf("%c",&c);
}
else Temp=0;
}
DestroyStack(OPTR);
DestroyStack(OPND);
return 0;
}
栈的基本操作及应用
最新推荐文章于 2022-12-27 13:56:29 发布