在本篇博文中,博主通過運用棧這一資料結構首先實現中綴表示式到字尾表示式的轉換,而後通過結果運用逆波蘭計算器得出計算結果。
具體**如下:
#include #include #include using namespace std;
typedef char elemtype;
typedef enum status;
#define stack_init_size 20
#define stackincrement 10
#define maxbuffer 10
typedef struct
sqstack;
void initstack(sqstack *s)
s->top = s->base;
s->stacksize = stack_init_size;
}status push(sqstack *s, elemtype e)
s->top = s->base + s->stacksize;
s->stacksize += stackincrement;
} *(s->top) = e;
s->top++;
return true;
}status pop(sqstack *s, elemtype *e)
*e = *--(s->top);
return true;
}int stacklen(sqstack s)
//中綴表示式轉換成字尾表示式
//規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字直接輸出,若是
//符號,則判斷其與棧頂的優先順序,是右括號或優先順序低於棧頂符號,則棧頂元素依次出棧並輸出
//直到遇到左括號或棧空才將此符號入棧。
status midtoend(sqstack s)
} if (')' == c)
}} else if ('+' == c || '-' == c)
else
else
} while (stacklen(s) && '(' != e);
//當棧不為空且棧頂值不為'('一直輸出
push(&s, c);
//將當前輸入符號入棧
}} else if ('*' == c || '/' == c || '(' == c)
else if ('#' == c)
else
scanf("%c", &c);
//繼續輸入
} while (stacklen(s))
//成功返回
return true;
}//逆波蘭計算器
void cal(sqstack s)
scanf("%c", &c);
if (c == ' ')//數字輸入結束
}switch (c)
else
break;
default:
break;
} scanf("%c", &c);
} pop(&s, &d);
//得出結果
printf("最終計算結果為:%d\n",d);
}int main()
else
return 0;
}
可以簡單的完成相應的計算。
逆波蘭計算器 中綴表示式轉字尾表示式
1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...
逆波蘭計算 中綴轉字尾 字尾表示式計算
我們利用棧將中綴表示式轉換為字尾表示式 逆波蘭表示式 來計算表示式 此程式支援整數運算 遍歷中綴表示式,遇到運算元就輸出,遇到符號就壓入棧中 棧中的運算子為掛起狀態 但是操作符的壓棧出棧有如下規則 碰到運算元壓入棧中,碰到運算子提取棧頂兩個元素進行相應的操作,將運算元壓入棧中,直到整個表示式遍歷完成...
字尾表示式計算規則 逆波蘭計算器
從左到右掃瞄,將數字壓入堆疊 遇到運算子,依次彈出數字棧中的棧頂元素和次棧頂元素,計算出來的值,再次入棧 依次迴圈掃瞄字尾表示式重複1,2規則,棧中唯一的數字就是字尾表示式的計算結果 這裡主要注意下第二條,計算時 棧頂元素和次棧頂元素 在符號運算時的先後順序 將次棧頂元素放在 運算符號的 左邊 棧頂...