#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...