1. 通過棧來實現字串公式的運算;main.c2. 中綴轉字尾:
遍歷中綴表示式中的數字和符號
對於數字: 直接輸出
對於符號:
->左括號: 進棧
->符號: 與棧頂符號進行優先順序比較
棧頂符號的優先順序低: 符號進棧
棧頂符號的優先順序高: 將棧頂符號彈出並輸出,之後進棧
->右括號: 將棧中的所有符號彈出並輸出
3. 計算字尾的值:
遍歷字尾表示式中的數字和符號
對於數字: 進棧
對於符號:
->從棧中彈出右運算元
->從棧中彈出左運算元
->根據符號進行運算
->將運算結果壓入棧中
遍歷結束:棧中的唯一數字為計算結果
4. 這裡採用了**復用的方法,即使用了linklist鍊錶和linkstack鏈棧,詳見《linklist單向鍊錶》和《linkstack鏈棧》;
#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...