史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2011-07-15, 11:05 PM   #1
bobo0836
註冊會員
榮譽勳章

勳章總數
UID - 347578
在線等級: 級別:0 | 在線時長:2小時 | 升級還需:3小時
註冊日期: 2011-07-12
文章: 6
精華: 0
現金: 8 金幣
資產: 8 金幣
預設 疑問 - 中序轉後序

請問,
1.為什麼pop(&item)可以用位址傳遞?不是應該用指標嗎?
2.if(item=='(')break
item 沒有內容怎麼會等於'('?
3.為什麼會push(token)?

語法:
  
/*定義堆疊最多可以存放MAX_SIZE個元素*/
#define MAX_SIZE 100

/*宣告stack是堆疊資料結構*/
typedef struct stk{
  char data[MAX_SIZE];/*存放堆疊的元素*/
  int top;            /*記錄堆疊的頂端*/
}stack;

/*宣告一個堆疊S存放運算子和左括號*/
stack S;

/*這個函數會將參數推入堆疊*/
push(char c)
{
    if (S.top < MAX_SIZE - 1) S.data[++S.top] = c;
}

/*這個函數會從堆疊彈出一個元素並存放在參數指定的位址*/ 
pop(char *c)
{
    if (S.top > -1) *c = S.data[S.top--];
}

/*這個函數會檢查參數是否為運算子,是的話,傳回1,否的話,傳回0*/ 
int is_operator(char c)
{
   if ((c == '+')||(c == '-')||(c == '*')||(c == '/')) return 1;
   else return 0; 
}

/*這個函數會檢查參數是否為運算元,是的話,傳回1,否的話,傳回0*/ 
int is_operand(char c)
{
  if (c >= 'a' && c <= 'z') return 1;
  else return 0;
}  

/*這個函數會根據參數指定的運算子傳回其優先順序*/ 
int get_precedence(char c)
{
    switch(c){
      case '(': return 0;
      case '+': return 1;
      case '-': return 1;
      case '*': return 2;
      case '/': return 2;
      default:  return -1;                                
    }          
}

/*這個函數會將中序表示法轉換為後序表示法*/ 
infix_to_postfix(char *infix, char *postfix)
{
    int i = 0, j = 0;
    char token, item;

    while((token = infix[i++]) != '\0')
    {
      if (is_operand(token))
postfix[j++] = token;
      else if (token == '(')
push(token);
      else if (token == ')')
while (S.top > -1){
 pop(&item);
 if (item == '(')    break;
 postfix[j++] = item;
}
      else if (is_operator(token)){
while (S.top > -1){
          if (get_precedence(token) > get_precedence(S.data[S.top])) break;
          else{
   pop(&item);
postfix[j++] = item;
 }
        }
push(token);
      }
    }
    
    while(S.top > -1)
    {
pop(&item);
postfix[j++] = item;
    }
    postfix[j] = '\0';
}

/*主程式*/
main()
{
    char infix[MAX_SIZE] = "a*(b+c)-d";  /*宣告中序表示法為 "a*(b+c)-d"*/ 
    char postfix[MAX_SIZE];              /*宣告用來存放後序表示法的變數*/                   
    infix_to_postfix(infix, postfix);    /*呼叫函數將中序表示法轉換成後序表示法*/ 
    printf("%s轉換為後序表示法會得到%s", infix, postfix);               /*印出後序表示法的結果*/ 
    getchar();
}
bobo0836 目前離線  
送花文章: 2, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
討論 - 中序轉前序與後序問題 9319074 程式語言討論區 2 2009-10-23 07:41 AM


所有時間均為台北時間。現在的時間是 05:28 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1