1. 程式人生 > >利用棧將中綴表示式轉換為字尾表示式並進行計算

利用棧將中綴表示式轉換為字尾表示式並進行計算

[問題描述]
中綴表示式是最普通的一種書寫表示式的方式,而後綴表示式不需要用括號來表示,計算機可簡化對字尾表示式的計算過程,而該過程又是棧的一個典型應用。
[實驗目的]
(1) 深入理解棧的特性。
(2) 掌握棧結構的構造方法。
[實驗內容及要求]
(1) 中綴表示式中只包含+、-、×、/ 運算及( 和 )。
(2) 可以輸入任意中綴表示式,資料為一位整數。
(3) 顯示中綴表示式及轉換後的字尾表示式(為清楚起見,要求每輸出一個數據用逗
號隔開)。
(4) 對轉換後的字尾表示式進行計算。
[測試資料]
(1) 6+3*(9-7)-8/2
轉換後的字尾表示式為:6397-*+82/-
計算結果為:8
(2) (8-2)/(3-1)*(9-6)
轉換後的字尾表示式為:82-31-/96-*
計算結果為:9

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 512

int top = -1;
int stack[512];

void Push(int e){
    if (top >= MAXSIZE){
        puts("棧已滿");
        exit(1);
    }
    stack[++top] = e;

}
int isEmpty(){
    return top==-1?1:0;
}
int Pop(){
    if (top == -1){
        puts
("這是一個空棧。"); exit(1); } return stack[top--]; } int getTop(){ if (top < MAXSIZE) return stack[top]; exit(1); } int judgePriority(char op1, char op2){ // 1 先出棧, 再進棧 // 0 直接進棧 if (op1=='(' || op2 == '(') return 0; if ((op1=='-'||op1=='+')&& (op2 =='*'
||op2 =='/')) return 0; return 1; } void infix2postfix(char *tmp, char *str){ char *p = tmp; int i, j, k; char op1, op2; j = 0; for (i=0; p[i]; i++){ // 數字 if (p[i] >= '0' && p[i] <= '9') str[j++] = p[i]; // 字元 else{ op1 = getTop(); op2 = p[i]; if (isEmpty()) Push(op2); // 非空 else{ if (op2 == ')'){ while (getTop() != '(') str[j++] = Pop(); Pop(); continue; } switch(judgePriority(op1, op2)){ case 1: str[j++] = Pop(); for (k=0; k<=top; k++){ if (!judgePriority(op1, op2)) break; str[j++] = Pop(); } Push(op2); break; case 0: Push(op2); break; } } } } while (!isEmpty()) str[j++] = Pop(); str[j] = 0; } int calc(char *buf){ int i, k, j; for (i=0; buf[i]; i++){ switch(buf[i]){ case '+': k = Pop() + Pop(); Push(k); break; case '-': j = Pop(); k = Pop() - j; Push(k); break; case '*': k = Pop() * Pop(); Push(k); break; case '/': j = Pop(); k = Pop()/j; Push(k); break; default: Push(buf[i]-48); } } return Pop(); } int main(){ char tmp[512]="9-2*2+(9-8)", str[512]; puts("輸入運算表示式:"); gets(tmp); infix2postfix(tmp,str); puts(str); printf("%s = %d\n", tmp, calc(str)); }

這裡寫圖片描述