2019年1月22日 星期二

資料結構 C語言 postfix後序轉中序計算

輸入後序運算式並計算結果:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>

struct stack_node                 // 宣告堆疊
{
   int data;
   struct stack_node *next;       // 指向下一節點
};
typedef struct stack_node stack_list;
typedef stack_list *link;

link push(link stack,int value)
{
   link new_node;                 // 新節黠

   new_node = ( link ) malloc(sizeof(stack_list));
   if ( !new_node )
   {
      printf("Memory Error! \n");
      return NULL;                // 存入失敗
   }
   new_node->data = value;        //建立節點內容
   new_node->next = stack;
   stack = new_node;
   return stack;
}

link pop(link stack,int *value)
{
   link top;
   if ( stack != NULL )
   {
      top = stack;
      stack = stack->next;
      *value = top->data;
      free(top);
      return stack;
   }
   else
      *value = -1;
}

int empty(link stack)  // 檢查堆疊是否是空的
{
   if ( stack == NULL )
      return 1;
   else
      return 0;
}



link operand  = NULL;

int isoperator(int op)
{
   switch ( (char) op )
   {
      case '+':
      case '-':
      case '*':
      case '/': return 1;
      default:  return 0;
   }
}
// 計算運算式的值
int get_value(int op,int operand1,int operand2)
{
   switch ( (char) op )
   {
      case '*': return ( operand2 * operand1 );
      case '/': return ( operand2 / operand1 );
      case '+': return ( operand2 + operand1 );
      case '-': return ( operand2 - operand1 );
   }
}

void main()
{
   char exp[100];
   int operand1 = 0;
   int operand2 = 0;
   int result = 0;
   int pos = 0;
   printf("請輸入後序運算式 ==> ");
   gets(exp);
   printf("後序運算式[%s]的結果是 ",exp);
   /* 剖析運算式字串迴圈 */
   while ( exp[pos] != '\0' && exp[pos] != '\n' )
   {
      if ( isoperator(exp[pos]) )
      {
         operand = pop(operand,&operand1);
         operand = pop(operand,&operand2);

         operand = push(operand,
                        get_value(exp[pos],operand1,operand2));
      }
      else
         operand = push(operand,exp[pos]-48);
      pos++;
   }
   operand = pop(operand,&result);
   printf(" %d\n",result);
}

沒有留言:

張貼留言