用栈对后缀表达式求值的算法(五种)

 第一种

/* 此程序的功能是求出用户输入的整形表达式的值*/
/*输入的表达式请用#结尾,比如:2+3+5,应输入:2+3+5#。*/
#include <stdio.h>
#define   MAXSIZE 16

typedef struct{
      int data[MAXSIZE];
      int top;
      int base;
    }seqstack;   /* 顺序栈的定义*/
/*以下为函数声明*/
void InitStack(seqstack *);       
int Empty(seqstack *);
void Push(seqstack *, int );
int Pop(seqstack *);
int GetTop(seqstack *);
int Operate(int ,char ,int );
char Proceed(char ,char );
int In(char );
int EvalExpres(void);
 
/* 定义两个栈分别存放运算符和操作数*/
seqstack StackR,StackD;

/*主函数*/
int main()
{
int v;
char ch;
while(1)
{
    printf("end with #,for example 2+3+5 input:2+3+5#/n");
      printf("calculate:") ;
    v = EvalExpres();        
    printf("The result is:%d",v);
                 /*以下为程序控制*/        
   printf("/nInput 'q' to quit and ENTER run again:");
    do{  
         scanf("%c",&ch);     
      if(ch == 'q' || ch == 'Q')
     exit(0);
     }while(ch!='/n');
system("cls");
}
return 0;
}

void InitStack(seqstack *s)
{     s->top = 0;
      s->base = 0;
}   /* 初始化栈*/


int Empty(seqstack *s)
{   if(s->top == s->base)
             return 1;
     else
        return 0;
}    /* 判断栈是否为空*/


void Push(seqstack *s, int x)
{   
    if(s->top == MAXSIZE)
         {    printf("OVER FLOW!/n");
              exit(0);
         }
    else
         {    s->data[s->top] = x;
              s->top++;
         }    
}    /* 进栈 */

int Pop(seqstack *s)
{    int e;
     if(Empty(s))
        {   printf("Under flow!/n");
             return 0;
        }   /* 下溢*/
     else
        {   s->top--;
          e = s->data[s->top];
            return e;
        }
} /* 出栈*/

int GetTop(seqstack *s)    /*取栈顶元素*/
{  
    if(Empty(s))
        {   printf("Under flow!/n");
             return 0;
        }
   else
      return s->data[s->top-1];     
}

int EvalExpres(void)    /* 表达式求解函数*/
{
     int a,b,i=0,s=0;
     char c[80],r;
     InitStack(&StackR);
     Push(&StackR,'#');
     InitStack(&StackD);
     printf(" end with #");
     gets(c);
     while(c[i]!='#' || GetTop(&StackR)!='#')
      {     
         if(!In(c[i]))   /* 判断读入的字符不是运算符 是则进栈*/
           { if(c[i] >= '0' && c[i] <= '9')
                {
                  s += c[i]-'0';     
                  while(!In(c[++i]))    /*此处实现的功能为当输入的数字为多位数时*/
                  { s*=10;
                    s += c[i]-'0';
                  }
                Push(&StackD,s+'0');
                  s = 0;
                }
             else
              {
                printf("wrong!/n");
                  return 0;
              }           
           }
      else        
         switch(Proceed(GetTop(&StackR),c[i])) /* 此函数用来比较读取的运算符和栈顶运算符的优先级*/
           {
               case '<':   /* 栈顶的元素优先级高*/
                 Push(&StackR,c[i]);
                    i++;
                  break;
               case '=':   /* 遇到匹配的小括号时则去掉他*/
                 Pop(&StackR);
                 i++;
                  break;
               case '>': /* 栈顶的优先级低则出栈并将结果写入栈内*/
     

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值