目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
棧-線性表
main.c
#include <stdio.h>
#include "LinkStack.h"//該程序用棧來計算算式
/*比如:1*5+6/(5-3) 可以轉換成 15*653-/+ 字符串進行運算注意:每個數只能是一位數*/int isNumber(char c)//檢測是否是數字
{return ('0' <= c) && (c <= '9');
}int isOperator(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( isNumber(exp[i]) )//如果是數字{LinkStack_Push(stack, (void*)value(exp[i]));//將數值轉成地址進棧 9轉成000009}else if( isOperator(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("9 + (3 - 1) * 5 + 8 / 2 = %d\n", compute("931-5*+82/+"));getchar();return 0;
}
分析:
匯編: