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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中缀表达式计算、后缀表达式计算、中缀转后缀

發布時間:2024/9/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中缀表达式计算、后缀表达式计算、中缀转后缀 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼來源 :
bilibili網站 :https://www.bilibili.com/video/av91996256?from=search&seid=17449723308302029804

注意:中綴表達式 轉 后綴表達式,函數 有誤。

中綴表達式 計算過程 :

后綴表達式 計算過程 :

中綴表達式 轉 后綴表達式 :

/* 前綴:prefix ** 中綴:Infix ** 后綴:Suffix exit為C++的退出函數,聲明于stdlib.h中,對于C++其標準的頭文件為cstdlib, 聲明為 void exit(int value); exit的功能為,退出當前運行的程序,并將參數value返回給主調進程。 在main中return v;的效果 與exit(v);相同。 exit(1)和exit(-1)是分別返回1和-1到主調程序。 exit(0): 返回0,表示程序正常退出,非0表示非正常退出。 exit(1):表示異常退出。 */#include <stdio.h> #include <stdlib.h> // #include <cstring> #include <string.h>enum boolean {FALSE,TRUE };typedef enum boolean Bool; //枚舉方式進行重定義 typedef int ElementType;struct stack {ElementType *element;int MaxSize; //大小int top; //線性表:長度; 棧:棧頂指針 };typedef struct stack Stack;//需要的函數 void InitStack(Stack *S, int sz); //初始化函數 void FreeStack(Stack *S); //釋放棧空間(即: 空間無) Bool Push(Stack *S, ElementType X); //壓棧 ElementType Pop(Stack *S); //彈棧(棧頂彈出) ElementType GetTop(Stack *S); // 獲取棧頂元素 void MakeStackEmpty(Stack *S); //置空(無元素,空間依然存在) Bool IsStackEmpty(Stack *S); //棧是否為空 Bool IsStackFull(Stack *S); //棧是否為滿void EvaluteMidPostfix(); //中綴表達式求值 void EvaluteBackPostfix(); //后綴表達式求值 void MidToBack(); //中綴轉后綴int main() {//printf("%d\n", (int)('9' - 48));//EvaluteMidPostfix();EvaluteBackPostfix();//MidToBack();return 0; }//實現各個功能函數void InitStack(Stack *S, int sz) //初始化棧(棧為空) {S->MaxSize = sz;S->top = -1; //指向-1; 一個元素:指向0S->element = (ElementType *)malloc(sizeof(ElementType) * S->MaxSize); }void FreeStack(Stack *S) //釋放棧空間(即: 空間無) {free(S->element); //釋放元素 }Bool IsStackFull(Stack *S) //棧是否為滿 {// return S->top == S->MaxSize-1;if (S->top == S->MaxSize - 1)return TRUE;return FALSE; }Bool IsStackEmpty(Stack *S) //棧是否為空 {//return S->top == -1;if (S->top == -1)return TRUE;return FALSE; }Bool Push(Stack *S, ElementType x) //壓棧 {//先判斷 棧滿?if (IsStackFull(S))return FALSE;else{//指針指向新的棧頂S->element[++S->top] = x; //top先加一return TRUE;} }ElementType Pop(Stack *S) //彈棧(棧頂彈出) {if (IsStackEmpty(S)){//return FALSE;exit(1); //表示異常退出}else{//先彈出元素,指針下移return S->element[S->top--];} }ElementType GetTop(Stack *S) // 獲取棧頂元素 {if (IsStackEmpty(S)){//return FALSE;exit(1); //表示異常退出}else{//先彈出元素,指針下移return S->element[S->top];} }void MakeStackEmpty(Stack *S) //置空(無元素,空間依然存在) {S->top = -1; }//從操作數棧取兩個操作數;從操作符棧取一個操作符 //用操作符對操作數進行運算。將計算結果壓入操作數棧。 void compute(Stack *Sptr, Stack *Spnd) //定義計算過程 {int k;switch (Pop(Sptr)){case '+':k = Pop(Spnd) + Pop(Spnd);break;case '-':k = Pop(Spnd);k = Pop(Spnd) - k;break;case '*':k = Pop(Spnd) * Pop(Spnd);break;case '/':k = Pop(Spnd);k = Pop(Spnd) / k;break;}Push(Spnd, k); //將計算結果壓入操作數棧。 }void EvaluteMidPostfix() //中綴表達式計算求值 {char buf[80];printf("Please input Infix : \n");scanf("%s", buf);//strcpy_s(buf, 80, "8-(3+5-4/2)*2/3");Stack *Spnd = (Stack *)malloc(sizeof(Stack));Stack *Sptr = (Stack *)malloc(sizeof(Stack));InitStack(Spnd, 80);InitStack(Sptr, 80);int i = 0;while (buf[i] != '\0'){//操作數類型if (buf[i] >= '0' && buf[i] <= '9')Push(Spnd, (int)(buf[i] - 48)); //printf("%d",(int)('9'-48));//操作符類型//優先級最高(若無括號&&之后也是*或/,從左到右計算)else if (buf[i] == '*' || buf[i] == '/') {// if(Sptr->top == -1 || GetTop(Sptr)=='(')//操作符直接入棧的條件// Push(Sptr,buf[i]);if (GetTop(Sptr) == '*' || GetTop(Sptr) == '/'){compute(Sptr, Spnd);}Push(Sptr, buf[i]);}else if (buf[i] == '+' || buf[i] == '-'){while (Sptr->top != -1 && GetTop(Sptr) != '(') //判斷語句不可交換位置。{compute(Sptr, Spnd);}Push(Sptr, buf[i]);}else if (buf[i] == ')'){while (GetTop(Sptr) != '('){compute(Sptr, Spnd);}Pop(Sptr);}else if (buf[i] == '('){Push(Sptr, buf[i]);}i++;}while (Sptr->top != -1) //結束條件: 操作符棧為空compute(Sptr, Spnd);printf("%d", Pop(Spnd)); }void EvaluteBackPostfix() //后綴表達式計算求值 {char buf[80];printf("Please input Suffix : \n");scanf("%s", buf);Stack *Spnd = (Stack *)malloc(sizeof(Stack));InitStack(Spnd, 80);int i = 0, k;while (buf[i] != '\0'){switch (buf[i]){case '+':k = Pop(Spnd) + Pop(Spnd);Push(Spnd, k);break;case '-':k = Pop(Spnd);k = Pop(Spnd) - k;Push(Spnd, k);break;case '*':k = Pop(Spnd) * Pop(Spnd);Push(Spnd, k);break;case '/':k = Pop(Spnd);k = Pop(Spnd) / k;Push(Spnd, k);break;default:Push(Spnd, (int)(buf[i] - 48));}i++;}printf("%d", Pop(Spnd)); }void MidToBack() //中綴轉后綴 {char buf[80];printf("Infix to suffix : \n");scanf("%s", buf); // 讀入中綴表達式//strcpy_s(buf, 80, "8-(3+5-4/2)*2/3");Stack *Sptr = (Stack *)malloc(sizeof(Stack));InitStack(Sptr, 80);int i = 0;while (buf[i] != '\0'){//操作數類型if (buf[i] >= '0' && buf[i] <= '9')printf("%c", buf[i]);//操作符類型else if (buf[i] == '*' || buf[i] == '/'){if (IsStackEmpty(Sptr)){Push(Sptr, buf[i]); //棧空,往里放東西}else if (GetTop(Sptr) == '*' || GetTop(Sptr) == '/'){printf("%c", Pop(Sptr));Push(Sptr, buf[i]);}else{Push(Sptr, buf[i]);}}else if (buf[i] == '+' || buf[i] == '-'){if (IsStackEmpty(Sptr)){Push(Sptr, buf[i]); //棧空,往里放東西}}else if (buf[i] == ')'){while (GetTop(Sptr) != '('){printf("%c", Pop(Sptr));}Pop(Sptr);}else if (buf[i] == '('){Push(Sptr, buf[i]);}i++;}while (Sptr->top != -1) //結束條件: 操作符棧為空printf("%c", Pop(Sptr)); }// 中綴:8-(3+5-4/2)*2/3 : 4 // 中綴:7+2*3/(2-3) : 1 // 后綴:234*+82/- : 10 // 中后:8-(3+5-4/2)*2/3 : 83542/-+2*3/- : 4 // 中后:2*(3+4)-8/2 : 234+*82/-

運行截圖:

總結

以上是生活随笔為你收集整理的中缀表达式计算、后缀表达式计算、中缀转后缀的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。