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,就会出现错误,限制小于输入时,超出部分不会进行读取。