資料結構之棧與佇列數學表示式的求值

2021-07-22 14:14:33 字數 2085 閱讀 9994

#pragma once

#include #include using namespace std;

typedef struct item;

const int counts =6 ; //「+-*/()」一共六個運算子,照抄書上的優先順序**(沒有用到'#')

const char precede[counts][counts] = ,

, ,, ,

,};double value(double a, char optr, double b);

char precede(char optr1, char optr2);

double evaluateexpression(stack& stackexpression, dequedequeexpression, const char * ptrexpression);

實現介面

#include #include #include #include #include"regular expression.h"

using namespace std;

double evaluateexpression(stack& stackexpression, dequedequeexpression, const char * ptrexpression)

);//atof()將字串轉化為浮點數,將數字放入佇列最後

} else //是運算子

);ptranalyze++; //越過這個運算子

}else

); //優先順序小就入棧

ptranalyze++; //越過這個運算子

break;

case '=':

stackexpression.pop(); //相等就使棧頂元素退棧( 其實就是當 '(' 和 ')' 相遇的時候,將一對括號都拋棄)

ptranalyze++;

break;

case '>':

item = stackexpression.top(); //優先順序比棧頂的運算子高,就使棧頂運算子退棧並放入佇列最後

dequeexpression.push_back(item);

stackexpression.pop();

break; //注意ptranalyze沒有自增,依然指向此運算子,直到比較結果為'

default:

break;}}

} }while (!stackexpression.empty()) //將棧中剩餘的運算子依次取出放入佇列最後

while (!dequeexpression.empty()) //將佇列中的元素從頭部依次放入棧中

); dequeexpression.pop_front();

continue;

} stackexpression.push(item); //如果不是運算子,就將運算元放入棧頂

dequeexpression.pop_front();

} return stackexpression.top().opnd;

}char precede(char optr1, char optr2) //判斷運算子優先順序

switch (optr2)

return precede[i][n]; //標頭檔案二維char陣列

}double value(double a, char optr, double b) //二元操作符的運算

表示式 棧的實現 資料結構

這段 對一些讀入的非法資料判斷存在錯誤 比如像出現 a b 就無法判斷了 另外需要注意的是我覺得棧裡面儲存的是char型的,但是在運算元值的時候,會很不方便 還有一點在主函式裡面如果想用while來多次讀入資料的話,那麼你要考慮上一次輸入資料失敗後,那後面的字元該怎麼操作 上面出現的問題大家可以嘗試...

資料結構之棧與佇列

寫在前面 棧與佇列是兩種不同特點的資料結構。棧遵循著先進後出的特點,它就像乙個器皿,先放進去的後被取出來,後放進去也就是靠近瓶口的先出來。佇列,就像它的名字一般,它的結構類似於排隊,先進先出,後進後出。棧的實現package stack public class mystack public mys...

資料結構之棧與佇列

順序棧儲存結構 define stack size 50 typedef structstack 順序棧初始化 void initstack stack s 順序進棧 int push stack s,type x 順序棧出棧 int pop stack s,type x 鏈棧儲存結構 typede...