中綴運算式轉換為首碼運算式

來源:互聯網
上載者:User

一、問題描述

將中綴運算式轉換為首碼運算式

如:將2*3/(2-1)+5*(4-1)轉化為+/*23-21*5-41

二、演算法流程

1)求輸入串的逆序。

2)檢查輸入的下一元素。

3)假如是運算元,把它添加到輸出串中。

4)假如是閉括弧,將它壓棧。

5)假如是運算子,則

i)假如棧空,此運算子入棧。

ii)假如棧頂是閉括弧,此運算子入棧。

iii)假如它的優先順序高於或等於棧頂運算子,此運算子入棧。

iv)否則,棧頂運算子出棧並添加到輸出串中,重複步驟5。

6)假如是開括弧,棧中運算子逐個出棧並輸出,直到遇到閉括弧。閉括弧出棧並丟棄。

7)假如輸入還未完畢,跳轉到步驟2。

8)假如輸入完畢,棧中剩餘的所有操作符出棧並加到輸出串中。

9)求輸出串的逆序。*/

(此演算法流程是從http://blog.csdn.net/tianya0609/article/details/6473660 copy過來的)

三、實現代碼(C語言)

 

 

#include <stdio.h>#include <stdlib.h>#include "stack_yutao.h"void reverse_and_copy(const char *source, char *dest);void reverse_self(char *array);void display_array(const char *array);void reverse_infix_to_reverse_prefix(char reverse_infix[], char reverse_prefix[]);int get_priority(char ch);int main(){char infix_array[15] = "1+2*9/(8-6)";char prefix_array[15];char reverse_infix[15];printf("display infix_array:");display_array(infix_array);reverse_and_copy(infix_array,reverse_infix);//將infix反轉得到reverse_infixprintf("display reverse_infix:");display_array(reverse_infix);reverse_infix_to_reverse_prefix(reverse_infix,prefix_array);//將反轉的infix轉換為反轉的prefixprintf("display prefix_array:");display_array(prefix_array);reverse_self(prefix_array);//將得到的反轉的prefix自反,得到最後的prefixprintf("display prefix_array:");display_array(prefix_array);system("pause");return 0;}void reverse_infix_to_reverse_prefix(char reverse_infix[], char reverse_prefix[]){int i = 0;stack my_stack;stack *s = &my_stack;int stack_size = 10;int len = 0;int index = 0;char temp;int flag;initStack(s,stack_size);i = 0;while('\0' != reverse_infix[i ++]);len = i - 1;for(i = 0; i < len; i ++){if('0' <= reverse_infix[i] && reverse_infix[i] <= '9'){reverse_prefix[index ++] = reverse_infix[i];continue;}switch(reverse_infix[i]){case '('://對於'(',彈出棧中元素並儲存到輸出序列中,直到遇到')',')'直接拋棄get_top(s,&temp);while(')' != temp){reverse_prefix[index ++] = temp;pop(s);get_top(s,&temp);}if(')' != temp){pop(s);}break;case ')'://對於')',直接入棧push(s,reverse_infix[i]);break;case '+':case '-':case '*':case '/':case '%':get_top(s,&temp);flag = (is_stack_empty(s)) || (')' == temp) || (get_priority(reverse_infix[i]) >= get_priority(temp));while(!flag)//當棧為空白、棧頂為')'或當前符號的優先順序大於等於棧頂符號的優先順序時,直接入棧;{//否則就一直從棧中彈出元素儲存到輸出直到該條件滿足reverse_prefix[index ++] = temp;pop(s);get_top(s,&temp);flag = (is_stack_empty(s)) || (')' == temp) || (get_priority(reverse_infix[i]) >= get_priority(temp));}push(s,reverse_infix[i]);break;default:printf("There must be something wrong in the program ! ---reverse_infix_to_reverse_prefix()\n");break;}}reverse_prefix[index] = '\0';}int get_priority(char ch){int priority = -1;switch(ch){case '+':case '-':priority = 0;break;case '*':case '/':case '%':priority = 1;break;default:printf("There must be something wrong in the program ! ---int get_priority(char ch)\n");system("pause");break;}return priority;}void reverse_and_copy(const char *source, char *dest){int i = 0;int len = 0;while('\0' != source[i ++]);len = i - 1;if(0 == len){return ;}for(i = 0; i < len; i ++){dest[i] = source[len - 1 -i];}dest[len] = '\0';}void reverse_self(char *array){int i = 0;int len = 0;int temp;while('\0' != array[i ++]);len = i - 1;if(0 == len){return ;}for(i = 0; i < len / 2; i ++){temp = array[i];array[i] = array[len - 1 - i];array[len - 1 - i] = temp;}array[len] = '\0';}void display_array(const char *array){int i = 0;while('\0' != array[i]){printf("%c ",array[i ++]);}printf("\n");}

 

四、思考

首碼、中綴、尾碼運算式與數的前序、中序、後序遍曆十分相似,並且可以用樹的結構來實現。

還沒有認真學習樹的實現,但是通過這裡中綴到首碼的轉換,這裡有個疑問:樹的後序遍曆是否可以這樣實現,首先反轉樹的左右節點,即同一個根節點的左節點變為右節點,右節點變為左節點,然後進行後序遍曆,再逆序遍曆結果?或者前序走訪也可同理得到?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.