棧表示式求值
字尾表示式求值
中綴表示式轉字尾表示式
**示例
棧是常用的資料結構,棧又稱堆疊,是一種受限的線性表。其限制是允許在表中的一端進行插入和刪除元素。棧中的元素符合後進先出(filo)的性質。允許插入和刪除元素的一端被稱為棧頂,另一端被稱為棧底。棧有兩種關鍵的操作,分別為出棧和壓棧。棧有兩種關鍵的操作,分別為出棧和壓棧。
壓棧(push):它是將元素e插入棧頂,使得新插入的元素e稱為新的棧頂。
棧的常見的應用主要有:編譯器中語法分析的符號匹配、表示式求值、程式的函式呼叫等。
例如:作業系統中的程序的上下文切換,裡面被切換下cpu的程序的現場資訊例如暫存器等資訊,被儲存在堆疊中,等到cpu輪轉到該程序時,使用堆疊恢復現場。
表示式求值是棧的乙個重要的應用。例如計算器中的加減乘除表示式的計算,都會使用棧來進行求值。
表示式的表示方法主要有中綴表示法和字尾表示法。
使用字尾表示式進行求值的時候,不需要考慮括號和運算符號的優先規則,只需要從左到右進行計算求值即可。
字尾表示式的求值過程為:
讀入運算元,壓入棧中直到讀取到操作符
如果讀取到為操作符,則將棧頂的前兩元素出棧,使用該操作符進行運算,得到計算結果
將計算結果壓入棧中
重複1、2、3直到表示式末尾
最後棧中只有乙個元素,變為最後的計算結果。將其出棧即可。
例如:
中綴表示式(2+1)*3
對應的字尾表示式為21+3*
出棧棧頂元素得到9
即為計算結果
計算機通常使用字尾表示式進行表示式求值,但是人們通常輸入計算的表示式是中綴表示式,因此在進行表示式求值的時候,應該先將中綴表示式轉為字尾表示式,然後使用字尾表示式求出表示式值。字尾表示式求值的過程很簡單,已經上面分析過了。現在關鍵的一步就是中綴表示式轉為字尾表示式。
中綴表示式轉字尾表示式是表示式求值關鍵的一步,其過程如下:
輸入中綴表示式iexp,
輸出字尾表示式***p
依次讀入中綴表示式iexp,初始化乙個棧s用來存放操作符op。
如果讀取的是運算元,直接輸出到***p。如果為操作符op,進入step2,如果為空,證明讀取到iexp尾部,則進入step5
判斷op,若為(
,無任何輸出,直接壓棧(
到s,進入step1;若為)
,則出棧s的元素輸出到***p中直到遇見元素(
,且(
不輸出到***p中,然後進入step1;若op不為(
和)
,則執行step3
判斷棧s的棧頂元素是否為(
,若為(
,則直接將op壓棧到s中;若不為(
,則將棧s的元素出棧輸出到***p中,直到棧頂元素的優先順序小於op或者棧空,最後進入step4
將op壓入棧s中,進入step1
將棧所有元素輸出到***p中
例如 iexp為(2+1)*3
,
初始化乙個空棧s.
//int棧
#include
#include
#define increment 20
struct stack_;
int pop_(struct stack_* stack)
void push_(struct stack_* stack, int c)
stack->a = p;
}//壓棧
stack->size++;
stack->top++;
stack->a[stack->top] = c;
}struct stack_* initstack_(int capacity) ;
//測試是否字元陣列是否存在test字元
int in(char* a, int n, char test)
return0;}
//優先順序比較
int compare(char a, char b)
if(a == '*')
}//中綴表示式轉為字尾表示式
char* infix2suffix(char* infix, int n) ;
int i = 0;
char *result = (char*)malloc(sizeof(char) * n);
char top;
int j = 0;
for(i; i < n; i++) else
if (compare(c, top) <= 0)
result[j++] = top;
}push(stack, c);
}if(c == '(')
push(stack, c);
if(c == ')') }}
}}
//輸出棧中剩餘的內容
while(1)
result[j++] = '#';
return result;
}//中綴表示式求值
int evaluate(char* infix, int n) ;
int i = 0;
char opnum1, opnum2;
char c;
while((c = suffix[i++]) != '#')
}return pop_(stack);
}int main() ;
int result = evaluate(infixexp, 13);
char *suffixexp = infix2suffix(infixexp, 13);
printf("\n");
while(*suffixexp!= '#')
printf("%c", *suffixexp++);
printf("\n%d", result);
return;
}
資料結構 棧的應用之表示式求值
任何乙個表示式都是由運算元 運算子和界限符組成的,我們稱它們為單詞。一般地,運算元既可以是常數也可以是被說明為變數或常量的識別符號 運算子可以分為算術運算子 關係運算子和邏輯運算子 基本界限符由左右括號和表示式結束符等。此處,我們討論簡單算術表示式的求值問題,這種表示式只含加 減 乘 除四種運算子以...
(複習)資料結構 棧 表示式求值
很久都沒有寫棧的程式了呢 由腦補可以字尾式求值是要用到棧的。所有說表示式求值可以分為兩部分 1.把中綴式轉換為字尾式 2.字尾式求值 include include include include include include include using namespace std char s ...
資料結構 棧實現表示式求值
expression.h calc expression 功能 利用棧實現整數表示式求值 輸入 表示式字串 輸出 求值結果 日期 2018 04 05 ifndef expression h define expression h include include include include 將中...