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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构-栈应用之逆波兰表达式(后缀表达式)

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-栈应用之逆波兰表达式(后缀表达式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

逆波蘭表達式含義我就不做贅述了,摘自百科上的一段話:

逆波蘭表達式又叫做后綴表達式。在通常的表達式中,二元運算符總是置于與之相關的兩個運算對象之間,這種表示法也稱為中綴表示。波蘭邏輯學家J.Lukasiewicz于1929年提出了另一種表示表達式的方法,按此方法,每一運算符都置于其運算對象之后,故稱為后綴表示。
逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做后綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表達式 逆波蘭表達式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a,1,3,+,=

用途

逆波蘭表達式是一種十分有用的表達式,它將復雜表達式轉換為可以依靠簡單的操作得到計算結果的表達式。例如(a+b)*(c+d)轉換為ab+cd+*


優勢

它的優勢在于只用兩種簡單操作,入棧和出棧就可以搞定任何普通表達式的運算。其運算方式如下:
如果當前字符為變量或者為數字,則壓棧,如果是運算符,則將棧頂兩個元素彈出作相應運算,結果再入棧,最后當表達式掃描完后,棧里的就是結果。

?

以上紅線為劃重點,如果沒理解這句話的意思,那么接下來的代碼就不用看了(無奈~~)

// // Created by Administrator on 2018/5/28. ////逆波蘭表達式(后綴表達式)#include "stdio.h" #include "stdlib.h" #include "string.h"#define ElementType int #define MaxSize 20//定義棧的結構體 typedef struct {ElementType *top;//棧頂指針(這里定義為指向棧頂元素的下一個位置,即為空)ElementType *base;//棧底指針int stackSize;//棧的容量 } Stack;/*** 初始化棧* @param s*/ void InitStack(Stack *s) {//初始化分配棧的總空間s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));if (!s->base) {//分配失敗printf("初始化分配空間失敗!");exit(0);}s->top = s->base;s->stackSize = MaxSize; }/*** 入棧* @param s 棧* @param e 入棧元素*/ void Push(Stack *s, ElementType e) {//判斷棧是否已滿if (s->top - s->base >= s->stackSize) {//棧已滿//處理方式1.遞增空間 2.退出printf("棧已滿~\n");exit(0);}*(s->top) = e; //賦值s->top++; }/*** 出棧* @param s 棧* @return*/ ElementType Pop(Stack *s) {//判斷棧是否為空if (s->base == s->top) {//棧為空//printf("\n不好意思,棧目前為空~\n");return -1;}s->top--;ElementType e = *(s->top);//取值,并不是取地址return e; }/*** 棧當前容量* @param s* @return*/ ElementType GetLen(Stack s) {int len = (s.top - s.base);return len; }int main() {//存在中綴表達式:1+2*(4-3)+6/6//轉換為后綴表達式:1234-*+66/+char exp[] = {'1', '2', '4', '3', '-', '*', '+', '6', '6', '/', '+'};Stack stack;InitStack(&stack);int len = strlen(exp);int length = sizeof(exp) / sizeof(exp[0]);for (int i = 0; i < length; i++) {char p = exp[i];int temp;ElementType a;ElementType b;switch (p) {case '+':a = Pop(&stack);b = Pop(&stack);temp = b + a;Push(&stack, temp);break;case '-':a = Pop(&stack);b = Pop(&stack);temp = b - a;Push(&stack, temp);break;case '*':a = Pop(&stack);b = Pop(&stack);temp = b * a;Push(&stack, temp);break;case '/':a = Pop(&stack);b = Pop(&stack);if (b == 0) {printf("除數不能為0~\n");return -1;}temp = b / a;Push(&stack, temp);break;default:temp = p - 48;Push(&stack, temp);break;}}char sum = Pop(&stack);printf("\n表達式計算結果 value=%d\n", sum); }

總結

以上是生活随笔為你收集整理的数据结构-栈应用之逆波兰表达式(后缀表达式)的全部內容,希望文章能夠幫你解決所遇到的問題。

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