棧的應用執行個體—運算式求值(C語言)

來源:互聯網
上載者:User

棧是限定僅在表尾進行插入或刪除操作的線性表。對棧來說,表尾端有其特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含元素的空表稱為空白棧。 

stack_s.c#include  "stdio.h"#include  "malloc.h"#define  TRUE 1#define  FALSE 0#define  OK  1#define  ERROR  0#define  INFEASIBLE -1#define  OVERFLOW -2typedef int Status;#define STACK_INIT_SIZE  100#define STACKINCREMENT  10typedef struct {            SELemType *base;            SELemType *top;            int   stacksize;}SqStack;Status InitStack (SqStack *S)(       S->base=(SElemType *) malloc (STACK_INIT_SIZE *sizeof(SElemType));       if (!S->base)            exit (OVERFLOW);       S->top=S->base;       S->stacksize=STACK_INIT_SIZE;       return OK;}Status StackEmpty (SqStack S){       if (S.top==S.base)           return TRUE;       else           return FALSE;}Status GetTop(SqStack S,SElemType *e){       if (S.top==S.base)           return ERROR;       *e=*(S.top-1);       return OK;}Status Push(SqStack *S,SElemType e){       if ((S->top-S->base)>=S->stacksize){           S->base=(SElemType *) realloc (S->base,(S->stacksize +STACKINCREMENT)*sizeof(SElemType));       if (!S->base)           exit (OVERFLOW);       S->top=S->base+S->stacksize;       S->stacksize+=STACKINCREMENT;}       *(S->top)=e;       S->top++;       return OK;}Status POP(SqStack *S,SElemType *e){       if (S->top==S->base)          return ERROR;       S->top--;       *e=*(S->top);       return OK;}Status Output (SElemType e){       printf("%d",e);       return OK;}  typedef int SElemType;#include <stype.h>#include "stack_s.c" Status in (char c,char op[]){       char *P;       p=op;       while(*p!='\0'){             if (c==*P)                 return TRUE;             p++;       }       return FALSE;}char Precede(char a,char b){       int i,j;       char pre[][7]={       {'>','>','<','<','<','>','>'},       {'>','>','<','<','<','>','>'},       {'>','>','>','>','<','>','>'},       {'>','>','>','>','<','>','>'},       {'<','<','<','<','<','=','0'},       {'>','>','>','>','0','>','>'},       {'<','<','<','<','<','0','='};     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 Pre[i][j];}int Operate(int a,char theta, int b){    int i,j,result;    i=a;    j=b;    switch(theta) {       case '+':result =i+j;break;       case '-':result =i-j;break;       case '*':result =i*j;break;       case '/':result =i/j;break;    }    return result;}int getNext(int *n){    char c;    *n=0;    while((c=getchar())=='');        if (!=isdigit(c)){             *n=c;             return 1;        }        do {           *n=*n*10+(c-'0');           c=getchar();           }while (isdigit (c));           ungetc(c,stdin);           return 0;}int EvaluateExpression(){      int n;      int flag;      int c;      char x,theta;      int a,b;      char op[]="+ - * / ( ) #";      SqStack OPTR;      SqStack OPND;            InitStack (& OPTR);Push (&OPTR,'#');      InitStack(& OPND);      flag=getNext(&c);       GetTop(OPTR,&x);      while (c!='#' || x!='#'){         if (flag ==0){              Push (&OPND,c);              flag =getNext(&c);         }         else{              GetTop(OPTR,&x);              switch(Precede(x,c)){                    case '<':                       Push(&OPTR,c);                       flag=getNext(&c);                       break;                    case '=':                       Pop(&OPTR,&x);                       flag=getNext(&c);                       break;                    case '>':                       Pop(&OPTR,&theta);                       Pop(&OPND,&b);                       Pop(&OPND,&a);                       Push(&OPND,Operate (a,theta,b));                       break;               }       }        GetTop(OPTR,&x);    }       GetTop(OPND,&c);        return c;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.