数据结构-栈应用之逆波兰表达式(后缀表达式)
逆波蘭表達式含義我就不做贅述了,摘自百科上的一段話:
逆波蘭表達式又叫做后綴表達式。在通常的表達式中,二元運算符總是置于與之相關的兩個運算對象之間,這種表示法也稱為中綴表示。波蘭邏輯學家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); }總結
以上是生活随笔為你收集整理的数据结构-栈应用之逆波兰表达式(后缀表达式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是云存储服务器
- 下一篇: springboot 整合mybats问