zoukankan      html  css  js  c++  java
  • 栈与后缀表达式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
    ");
     66     scanf_s("%s", buf,30);                                 //控制边界
     67 
     68     while (buf[i] != '')
     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
    ", 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,就会出现错误,限制小于输入时,超出部分不会进行读取。

      

  • 相关阅读:
    GlusterFS + lagstash + elasticsearch + kibana 3 + redis日志收集存储系统部署 01
    Python输出字符串或文件颜色显示
    系统维护常用脚本
    免密码登录服务器python脚本
    python 常用模块之ConfigParser
    Robot Framework -004 为了进行Web测试,安装SeleniumLibrary外部库
    Robot Framework -005 测试SeleniumLibrary外部库,添加一个测试web用例
    Robot Framework -003 在Windows10 安装Eclipse作为编辑器,安装 RED 插件。
    Robot Framework -002 在Windows10上的安装
    Robot Framework -001 简介
  • 原文地址:https://www.cnblogs.com/ambdyx/p/11738645.html
Copyright © 2011-2022 走看看