表示式計算

2021-07-02 15:53:27 字數 2516 閱讀 6685

棧的應用舉例 :

棧在表示式計算過程中的應用 :建立運算元棧和運算子棧。運算子有優先順序。規則: 

自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。

當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。

左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。

二 表示式計算

//1+3*5

char buf[1024];

第一步:

建立兩個棧 operand_stack,operator_stack

第二 :

掃瞄表示式

運算元入棧的規則:直接入棧

push_stack(operator_stack,*p - '0');

運算子入棧的規則:

1.棧為空

2.當前運算子level > 棧頂運算子 level

int get_level(char operator)

} 注意:

1.如果不滿足運算子入棧的條件,就計算,一直到滿足入棧條件為止

int compute(linkstack *opd_s,linkstack *opt_s)

} 2.掃瞄結束的時候,需要判斷運算子的棧是否為空

不為空則計算

最後的結果放在運算元的棧

例如 :計算 ( 4+8 )×2-3 ;

運算元棧 :4  8    | 12      2|24     3|21

運算子棧 :( +      |×            |-        |

**如下:

head.h

#ifndef _head_h_

typedef int datatype;

//棧中資料節點型別

typedef struct node

linknode;

//棧頭型別

typedef struct

linkstack;

extern linkstack *create_empty_linkstack();

extern int is_empty_linkstack(linkstack *s);

extern int push_linkstack(linkstack *s,datatype data);

extern datatype pop_linkstack(linkstack *s);

extern datatype get_top_linkstack(linkstack *s);

#endif

linkstack.c

#include #include #include "head.h"

linkstack *create_empty_linkstack()

int is_empty_linkstack(linkstack *s)

int push_linkstack(linkstack *s,datatype data)

datatype pop_linkstack(linkstack *s)

datatype get_top_linkstack(linkstack *s)

main.c

#include #include "head.h"

int get_operator_level(int operator)

}int calc(linkstack *opt_stack,linkstack *opd_stack)

return 0;

}int deal_with_operator(linkstack *opt_stack,int operator,linkstack *opd_stack)

push_linkstack(opt_stack,operator);

return 0;

}int calc_expression(char *string)

push_linkstack(opd_stack,data);

}switch(*p)

//出左括號

pop_linkstack(opt_stack);

break;

case '\0':

goto next;

} }next:

//判斷運算子的棧是否為空,不為空則計算

while(!is_empty_linkstack(opt_stack))

return pop_linkstack(opd_stack);

}int main(int argc, const char *argv)

執行結果如下:

表示式計算

表示式計算對於我們人來說,喜歡通過中綴表示式來計算,而計算機則不一樣,需要通過字尾表示式來計算,首先通過例項來介紹一下中綴表示式和字尾表示式 例子 中綴表示式 3 5 2 3 6 字尾表示式 3 5 2 3 6 那麼轉換規則是怎麼樣的呢?規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,...

表示式計算

表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算...

表示式計算

問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。include includ...