棧的應用 計算字串表示式

2021-08-07 12:46:23 字數 2143 閱讀 5514

1. 通過棧來實現字串公式的運算;

2. 中綴轉字尾:

遍歷中綴表示式中的數字和符號

對於數字: 直接輸出

對於符號:

->左括號: 進棧

->符號:  與棧頂符號進行優先順序比較

棧頂符號的優先順序低: 符號進棧

棧頂符號的優先順序高: 將棧頂符號彈出並輸出,之後進棧

->右括號: 將棧中的所有符號彈出並輸出

3. 計算字尾的值:

遍歷字尾表示式中的數字和符號

對於數字: 進棧

對於符號:

->從棧中彈出右運算元

->從棧中彈出左運算元

->根據符號進行運算

->將運算結果壓入棧中

遍歷結束:棧中的唯一數字為計算結果

4. 這裡採用了**復用的方法,即使用了linklist鍊錶和linkstack鏈棧,詳見《linklist單向鍊錶》和《linkstack鏈棧》;

main.c

#include 

#include "linkstack.h"

//輸出

void output(char c)

}//判斷是否為數字

int isnumber(char c)

//判斷是否為操作符

int isoperator(char c)

//是否為'('

int isleft(char c)

//是否為')'

int isright(char c)

//比較優先順序

int priority(char c)

if ((c == '*') || (c == '/'))

return ret;

}//字元轉數字

int value(char c)

//計算左右運算元的值

int express(int left, int right, char op)

return ret;

}//中綴轉字尾,返回字尾字串,並輸出

char* transform(const

char* exp)

//判斷是否為操作符

else

if (isoperator(exp[i]))

//將當前操作符壓入棧

linkstack_push(stack, (void*)(int)exp[i]);

}//判斷是否為'('

else

if (isleft(exp[i]))

//判斷是否為')'

else

if (isright(exp[i]))

//彈出'('

linkstack_pop(stack);

}else

i++;

}//彈出棧內所有元素

while ((linkstack_size(stack) > 0) && (exp[i] == '\0'))

linkstack_destroy(stack);

return ret;

}//計算整個表示式的值

int compute(const

char* exp)

else

if (isoperator(exp[i]))

else

i++;

}if ((linkstack_size(stack) == 1) && (exp[i] == '\0'))

else

linkstack_destroy(stack);

return ret;

}int main()

1.isnumber

2.isoperator

3.isleft

4.isright

5.priority

6.express

7.transform

8.compute

棧的應用 計算字串表示式

計算機的本質工作就是做數 算 那計算機可以讀 入字串 1 2 3 4 5 6 7 並計算值嗎?答案是肯定的。這裡我基本實現了個位數的加減乘除,當然這個演算法最簡單的解決方式是採用二叉樹 後面會實現 這裡作出了棧的實現方式。首先引入兩個概念 中綴表示式和字尾表示式 1,在生活中我們通常書寫1 1的時候...

棧的應用 計算表示式

挺久之前寫的乙個作業,acm選修課的,用棧實現的計算表示式,有兩種,一種是將表示式轉換為字尾表示式再計算,一種是直接計算中綴表示式,下面是 1 轉字尾再計算 include includeusing namespace std int main s2.push s i break case case...

棧實現字串表示式計算

最近頻繁解決計算方面的問題,其中就有實現字串表示式計算返回結果值需求,通過使用棧實現,需要定義運算符號優先順序,其它就不細說,如下 csstack.cs using system namespace pyhb 設定棧大最大容量 public void initialize int size 入棧 p...