棧的應用舉例 :
棧在表示式計算過程中的應用 :建立運算元棧和運算子棧。運算子有優先順序。規則:
自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。
當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。
左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。
二 表示式計算
//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...