利用棧將中綴表示式轉換為字尾表示式並進行計算
阿新 • • 發佈:2019-01-06
[問題描述]
中綴表示式是最普通的一種書寫表示式的方式,而後綴表示式不需要用括號來表示,計算機可簡化對字尾表示式的計算過程,而該過程又是棧的一個典型應用。
[實驗目的]
(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));
}