棧應用 - 後綴表達式的計算
阿新 • • 發佈:2017-08-06
structure str hub def csdn oid 應用 ref pri
project文件詳情:Github
有關棧API詳情參看我的還有一篇博文: 棧的鏈式存儲 - API實現
遍歷後綴表達式中的數字和符號
對於數字:進棧
對於符號:
從棧中彈出右操作數
從棧中彈出左操作數
依據符號進行運算
將運算結果壓入棧中
遍歷結束:棧中的唯一數字為計算結果
#include <stdio.h> #include "LinkStack.h" int isNumber3(char c) { return ('0' <= c) && (c <= '9'); } int isOperator3(char c) { return (c == '+') || (c == '-') || (c == '*') || (c == '/'); } int value(char c) { return (c - '0'); } int express(int left, int right, char op) { int ret = 0; switch (op) { case '+': ret = left + right; break; case '-': ret = left - right; break; case '*': ret = left * right; break; case '/': ret = left / right; break; default: break; } return ret; } int compute(const char* exp) { LinkStack* stack = LinkStack_Create(); int ret = 0; int i = 0; while (exp[i] != '\0') { if (isNumber3(exp[i])) { LinkStack_Push(stack, (void*)value(exp[i])); } else if (isOperator3(exp[i])) { int right = (int)LinkStack_Pop(stack); int left = (int)LinkStack_Pop(stack); int result = express(left, right, exp[i]); LinkStack_Push(stack, (void*)result); } else { printf("Invalid expression!"); break; } i++; } if ((LinkStack_Size(stack) == 1) && (exp[i] == '\0')) { ret = (int)LinkStack_Pop(stack); } else { printf("Invalid expression!"); } LinkStack_Destroy(stack); return ret; } int main() { printf("8 + (3 - 1) * 5 = %d\n", compute("831-5*+")); return 0; }
棧應用 - 後綴表達式的計算