栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)
生活随笔
收集整理的這篇文章主要介紹了
栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
棧-線性表
main.c
#include <stdio.h> #include "LinkStack.h"//該程序用棧來計(jì)算算式 /*比如:1*5+6/(5-3) 可以轉(zhuǎn)換成 15*653-/+ 字符串進(jìn)行運(yùn)算注意:每個(gè)數(shù)只能是一位數(shù)*/int isNumber(char c)//檢測(cè)是否是數(shù)字 {return ('0' <= c) && (c <= '9'); }int isOperator(char c)//檢測(cè)是否是加減乘除符號(hào) {return (c == '+') || (c == '-') || (c == '*') || (c == '/'); }int value(char c)//字符返回?cái)?shù)值 {return (c - '0'); }int express(int left, int right, char op)//計(jì)算兩個(gè)值加減乘除 {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)//將字符串的算式計(jì)算結(jié)果 {LinkStack* stack = LinkStack_Create();//創(chuàng)建棧int ret = 0;int i = 0;while( exp[i] != '\0' )//將每個(gè)字符取出{if( isNumber(exp[i]) )//如果是數(shù)字{LinkStack_Push(stack, (void*)value(exp[i]));//將數(shù)值轉(zhuǎn)成地址進(jìn)棧 9轉(zhuǎn)成000009}else if( isOperator(exp[i]) )//如果是運(yùn)算符號(hào){int right = (int)LinkStack_Pop(stack);int left = (int)LinkStack_Pop(stack);int result = express(left, right, exp[i]);//取出兩個(gè)數(shù)值運(yùn)算LinkStack_Push(stack, (void*)result);//再將結(jié)果進(jìn)棧}else{printf("Invalid expression!");break;}i++;}if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )//如果棧內(nèi)只有一個(gè)元素就是最后的運(yùn)算后進(jìn)棧的結(jié)果{ret = (int)LinkStack_Pop(stack);//出棧獲取算式結(jié)果} 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; }分析:
匯編:
總結(jié)
以上是生活随笔為你收集整理的栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开封看输卵管炎最好的医院推荐
- 下一篇: 栈应用_将算式转成按运算符优先级分布(代