常用資料結構棧的應用 表示式求值

2021-07-22 16:47:07 字數 3030 閱讀 4101

棧表示式求值

字尾表示式求值

中綴表示式轉字尾表示式

**示例

棧是常用的資料結構,棧又稱堆疊,是一種受限的線性表。其限制是允許在表中的一端進行插入和刪除元素。棧中的元素符合後進先出(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 將中...