栈与后缀表达式C实现

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 typedef char datatype;
  5 typedef struct stack 
  6 {
  7     int top;                     /*栈顶指针*/
  8     datatype* data;              /*数组*/
  9     int MaxSize;                    /*栈大小*/
 10 }stack;
 11 
 12 /*初始化空栈*/
 13 void InitStack(stack* st, int sz)
 14 {
 15     st->top = -1;
 16     st->MaxSize = sz;
 17     st->data = (datatype*)malloc(sizeof(datatype) * st->MaxSize);                   //分配内存
 18 }
 19 /*释放站空间*/
 20 void FreeStack(stack* st)
 21 {
 22     free(st->data);
 23 }
 24 /*压栈*/
 25 int Push(stack* st, datatype d)
 26 {
 27     if (st->top == st->MaxSize-1) return -1;
 28     st->data[++(st->top)] = d;
 29     return 0;
 30 }
 31 /*弹栈*/
 32 datatype Pop(stack* st)
 33 {
 34     if ((st->top) == -1)
 35     {
 36         printf("llll%d",st->top);
 37         exit(-1);
 38     }
 39     else {
 40         return st->data[(st->top)--];
 41     }
 42     
 43 }
 44 /*取顶*/
 45 datatype getTop(stack* st)
 46 {
 47     if(st->top>-1)
 48         return st->data[st->top];
 49     return NULL;
 50 }
 51 /*栈置空*/
 52 void MakeEmpty(stack* st)
 53 {
 54     st->top = -1;
 55 }
 56 
 57 /*后缀表达式计算*/
 58 int Midcal()
 59 {
 60     stack* sptr = (stack*)malloc(sizeof(stack));                
 61     char buf[80];
 62     int i = 0, k;
 63     InitStack(sptr, 80);
 64 
 65     printf("input Postfix\n");
 66     scanf_s("%s", buf,30);                                 //控制边界
 67 
 68     while (buf[i] != '\0')
 69     {
 70         switch (buf[i]) 
 71         {
 72         case '+':
 73             k = Pop(sptr)+Pop(sptr);
 74             Push(sptr,k);
 75             break;
 76 
 77         case '-':
 78             k = Pop(sptr);
 79             k = Pop(sptr) - k;
 80             Push(sptr, k);
 81             break;
 82         case '*':
 83             k = Pop(sptr) * Pop(sptr);
 84             Push(sptr, k);
 85             break;
 86 
 87         case '/':
 88             k = Pop(sptr);
 89             k = Pop(sptr) / k;
 90             Push(sptr, k);
 91             break;
 92         default:
 93             
 94             Push(sptr, (int)(buf[i] - 48));
 95         }
 96         i++;
 97     }
 98     printf("The value is %d\n", Pop(sptr));
 99     return 0;
100 }
101 
102 main() {
103     Midcal();
104 }

注:我们在使用scan方法时建议使用scanf_s: 因为这个方法有溢出限制和边界检查,防止因数据溢出造成程序数据混乱的问题。

  其中VS2019以及接近版本都会在使用scanf时报错,强制使用scanf_s.

       scanf_s("%type",space,limit)  第一个参数是类型,第二个参数是输入数的存储地址,第三个就是你的限制空间了。

 

  以上代码部分,如果设置limit <10,就会出现错误,限制小于输入时,超出部分不会进行读取。

 

  

 

posted @ 2019-10-25 16:18  ambrose  阅读(462)  评论(0编辑  收藏  举报