日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Algorithm Gossip (22) 中序式转后序式(前序式)

發(fā)布時(shí)間:2025/7/14 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Algorithm Gossip (22) 中序式转后序式(前序式) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

This Series aritcles are all based on the book 《經(jīng)典算法大全》; 對(duì)于該書(shū)的所有案例進(jìn)行一個(gè)探究和拓展,并且用python和C++進(jìn)行實(shí)現(xiàn); 目的是熟悉常用算法過(guò)程中的技巧和邏輯拓展。

提出問(wèn)題

22.Algorithm Gossip: 中序式轉(zhuǎn)后序式(前序式)

說(shuō)明

平常所使用的運(yùn)算式,主要是將運(yùn)算元放在運(yùn)算子的兩旁,例如a+b/d這樣的式子,這稱之為中序(Infix)表示式,對(duì)于人類(lèi)來(lái)說(shuō),這樣的式子很容易理 解,但由于電腦執(zhí)行指令時(shí)是有順序的,遇到中序表示式時(shí),無(wú)法直接進(jìn)行運(yùn)算,而必須進(jìn)一步判斷運(yùn)算的先后順序,所以必須將中序表示式轉(zhuǎn)換為另一種表示方 法。可以將中序表示式轉(zhuǎn)換為后序(Postfix)表示式,后序表示式又稱之為逆向波蘭表示式(Reversepolish notation),它是由波蘭的數(shù)學(xué)家盧卡謝維奇提出,例如(a+b)(c+d)這個(gè)式子,表示為后序表示式時(shí)是ab+cd+。

解法

用手算的方式來(lái)計(jì)算后序式相當(dāng)?shù)暮?jiǎn)單,將運(yùn)算子兩旁的運(yùn)算元依先后順序全括號(hào)起來(lái) ,然后將所有的右括號(hào)取代為左邊最接近的運(yùn)算子(從最內(nèi)層括號(hào)開(kāi)始),最后去掉所有的左括號(hào)就可以完成后序表示式。
如果要用程式來(lái)進(jìn)行中序轉(zhuǎn)后序,則必須使用堆疊,演算法很簡(jiǎn)單,直接敘述的話就是使用回圈,取出中序式的字元,遇運(yùn)算元直接輸出,堆疊運(yùn)算子與左括號(hào), ISP>ICP的話直接輸出堆疊中的運(yùn)算子,遇右括號(hào)輸出堆疊中的運(yùn)算子至左括號(hào)。如果要將中序式轉(zhuǎn)為前序式,則在讀取中序式時(shí)是由后往前讀取,而左右括號(hào)的處理方式相反 ,其余不變,但輸出之前必須先置入堆疊,待轉(zhuǎn)換完成后再將堆疊中的 值由上往下讀出,如此就是前序表示式。

分析和解釋

代碼

C 代碼演示

#include <stdio.h> #include <stdlib.h> int postfix(char*); // 中序轉(zhuǎn)后序 int priority(char); // 決定運(yùn)算子優(yōu)先順序 int main(void) {char input[80];printf("輸入中序運(yùn)算式:");scanf("%s", input);postfix(input);return 0;} int postfix(char* infix) {int i = 0, top = 0;char stack[80] = {'\0'};char op;while(1) {op = infix[i];switch(op) {case '\0':while(top > 0) {printf("%c", stack[top]);top--;}printf("\n");return 0;// 運(yùn)算子堆疊case '(':if(top < (sizeof(stack) / sizeof(char))) {top++;stack[top] = op;}break;case '+': case '-': case '*': case '/':while(priority(stack[top]) >= priority(op)) {printf("%c", stack[top]);top--;}// 存入堆疊if(top < (sizeof(stack) / sizeof(char))) {top++;stack[top] = op;}break;// 遇 ) 輸出至 (case ')':while(stack[top] != '(') {printf("%c", stack[top]);top--;}top--; // 不輸出(break;// 運(yùn)算元直接輸出default:printf("%c", op);break;}i++;}} int priority(char op) {int p;switch(op) {case '+': case '-':p = 1;break;case '*': case '/':p = 2;break;default:p = 0;break;}return p;}

拓展和關(guān)聯(lián)

后記

參考書(shū)籍

  • 《經(jīng)典算法大全》
  • 維基百科

轉(zhuǎn)載于:https://www.cnblogs.com/actanble/p/6713394.html

總結(jié)

以上是生活随笔為你收集整理的Algorithm Gossip (22) 中序式转后序式(前序式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。