程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 表達式求值 逆波蘭式

表達式求值 逆波蘭式

編輯:關於C語言

如題,代碼如下,歡迎探討!!!

[code=C/C++][/code]
/* 表達式的後綴表示及其求值 */
#include <stdio.h>

typedef int ElemType; /* 考慮到char型運算時的隱形提升會溢出,此處定義為int,代價僅浪費了內存空間 */

#define MAXNUM 16

struct stack
{
  ElemType data[MAXNUM];
  int top;
};

void StackInit(struct stack *stack)
{
  int i = 0;
  for(;i < MAXNUM;i++)
  {
  stack->data[i] = 0;
  }
  stack->top = 0; /* 棧底部從索引0處開始 */
}

void StackPush(struct stack *stack,ElemType c)
{
  if(MAXNUM == stack->top) /* 棧中元素最多有MAXNUM - 1個 */
  {
  printf("The stack is full ");
  return;
  }
  stack->data[stack->top++] = c;
}

ElemType StackPop(struct stack *stack)
{
  if(0 == stack->top)
  {
  printf("The stack is empty "); /* 當棧空時,若返回0是錯誤的 */
  return 0;
  }
  return stack->data[--stack->top];
}

void PostfixEvaluation(struct stack *stack)
{
  return; /* 這個函數非常簡單了,所有的麻煩都已經解決了,我實在不想完成它 */
}

int ChangeToPostfix(char *str)
{
  int i = 0,flag = 0; /* flag 用來標記連續數字的出現,沒想到好點的辦法 */
  int c,ch;

  struct stack ch_stack;
  struct stack op_stack;

  StackInit(&ch_stack);
  StackInit(&op_stack);

  while( != (c = *(str + i))) /* 此處需注意的是:如果是靜態的字符串,以為結束條件,如果是用戶輸入的,則以 ’為結束條件 */
  {
  if((* == c) || (/ == c) || (( == c))
  {
  flag = 0;
  StackPush(&op_stack,c);
  }
  else if() == c)
  {
  flag = 0;
  while(( != (c = StackPop(&op_stack)))
  {
  StackPush(&ch_stack,c);
  }
  if(0 == op_stack.top)
  {
  printf("the ( hasnt found when the ) come in! ");
  return -1;
  }
  }
  else if((+ == c)|| (- == c))
  {
  flag = 0;
  /* +和-優先級低,運算符棧中的((如果存在)後的所有運算符需推出 */
  if(0 != op_stack.top) /* 你可以不在此處添加top的檢查,那樣,你可以發現 StackPop錯誤返回的0被拾取了 */
  { /* 被逼無奈,只得在此檢查top值,無法寄希望於StackPop了 */
  while(( != (ch = StackPop(&op_stack)))
  {
  StackPush(&ch_stack,ch);
  if(0 == op_stack.top)
  {
  break;
  }
  }
  }
  StackPush(&op_stack,c);
  }
  else if((c >= 0) && (c <= 9)) /* 對於表達式中2位或多位連續的數字,需特殊處理 */
  {
  if(0 == flag)
  {
  StackPush(&ch_stack,(c - 0));
  flag = 1;
  }
  else
  {
  StackPush(&ch_stack,10 * StackPop(&ch_stack) + (c - 0));
  }
  }
  i++;
  }
  while(0 != op_stack.top) /* 表達式處理結束,將運算符棧中的所有運算符推出並壓入字符棧 */
  {
  StackPush(&ch_stack,StackPop(&op_stack));
  }

  PostfixEvaluation(&ch_stack); /* 該函數放在此處可能較為欠妥,可是,只要完成了任務不就OK了麼,難道你會在乎? */

/*just test */
  for(i = 0;i < ch_stack.top;i++)
  {
  if(+ == ch_stack.data[i])
  {
  printf("+..");
  }
  else if(- == ch_stack.data[i])
  {
  printf("-..");
  }
  else if(* == ch_stack.data[i])
  {
  printf("*..");
  }
  else if(/ == ch_stack.data[i])
  {
  printf("/..");
  }
  else
  {
  printf("%d..",ch_stack.data[i]);
  }
  }

  return 0;
}


int main(void)
{
  char str[] = "12 + 34 * 435 - 5 / 1";
/* just test */
  printf("The result should be : ");
  printf("12 34 435 * + 5 1 / - [= 8] ");

  if(-1 == ChangeToPostfix(str))
  {
printf("ChangeToPostfix() error ");
return 1;
}
return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved