栈的基本操作及应用

来源:互联网 发布:finalcut mac 破解版 编辑:程序博客网 时间:2024/06/07 06:30
/*栈的基本操作及实现表达式求值*/#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 0typedef int Status;typedef struct {    float *base;//在栈构造之前和销毁之后,base的值为NULL    float *top;//栈顶指针    int stacksize; //当前已分配的存储空间}SqStack;char sign[8]={"+-*/()#"};                 //运算符之间的关系                //    +   -   *   /   (   )   #   char relation[7][7]={             /* + */{'>','>','<','<','<','>','>'},             /* - */{'>','>','<','<','<','>','>'},             /* * */{'>','>','>','>','<','>','>'},             /* / */{'>','>','>','>','<','>','>'},             /* ( */{'<','<','<','<','<','=',' '},             /* ) */{'>','>','>','>',' ','>','>'},             /* # */{'<','<','<','<','<',' ','='}                    };//构造一个空栈SStatus 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;}