已知一組中綴表示式,求其後主表示式
例:中綴表示式:(1+2)*3+(4+6)*(5*6)+7
字尾表示式:1 2+3*4 6+5 6** +7+
求解此問題通常有兩種方法:
1. 利用棧來儲存運算子,通過比較優先順序進行出入棧操作。
2. 將中綴表示式轉換為二叉樹,對二叉樹進行後序遍歷。
1. 數字直接輸出,不入棧。
2. 除右括號外,所有運算子入棧。
3. 入棧前與棧頂元素對比,如果棧頂運算子優先順序高,則不斷彈出,直至新棧頂為相對低優先順序運算子。
4. 遇到右括號時,不斷彈出棧頂直至最頂左括號彈出。輸出除左括號外所有運算子。(左括號也彈出,但不輸出)
5. 輸入結束時,應彈出並輸出所有運算子。(左括號只彈,不輸出)
#pragma once
#ifndef _stack_h
#define max 1000
typedef int elementtype;
struct mystack ;
typedef struct mystack *stack;
void push(elementtype e, stack s);
void pop(stack s);
int isempty(stack s);
int isfull(stack s);
void makeempty(stack s);
stack creatstack(int maxele);
void distroystack(stack s);
elementtype top(stack s);
#endif
// stack.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include "stack.h"
#include int arr[100];
mystack ss;
stack gs;
void push(elementtype e, stack s)
}void pop(stack s)
int isempty(stack s)
int isfull(stack s)
void makeempty(stack s)
s->top = 0;
}stack creatstack(int maxele)
void distroystack(stack s)
elementtype top(stack s)
return 0;
}int main()
push(c, &ss);
} if (c == '*' || c == '/')
push(c, &ss);
} if (c == '(')
if (c == ')')
} if (c == 10)
}} }
return 0;
}
棧的應用之逆波蘭計算器練習
public class operation return result 逆波蘭表示式,在逆波蘭記法中,所有操作符置於運算元的後面,所以逆波蘭表示又稱字尾表示式。逆波蘭記法不需要括號來標識操作符的優先順序。將中綴表示式轉後字尾表示式需要用到兩個棧,乙個是符號棧,乙個是結果棧。先將表示式轉成list型...
資料結構 棧應用之逆波蘭表示式(字尾表示式)
逆波蘭表示式含義我就不做贅述了,摘自百科上的一段話 逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為...
逆波蘭表示式 遞迴 演算法學習
問題 逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 3的逆波蘭表示法為 23.逆波蘭 表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如 2 3 4的逆波蘭表示法為 234.本體求解逆波蘭表示式的值,其中運算子包括 四個 輸入輸入為一行,其中運算子和運算數之...