支持多位數(shù),括號(hào)污朽,四則運(yùn)算散吵,的計(jì)算器算法c++實(shí)現(xiàn)

#include<iostream>

#include<string>

#include<stack>

#include<stdio.h>

using namespace std;

//23+(34*45)/(5+6+7)

//2+3*5+6+7

int priority(char c)

{

if (c == ')')

{

return 4;

}

else if (c == '^')

{

return 3;

}

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

{

return 2;

}

else if (c == '+' || c == '-')

{

return 1;

}

else if (c == '(')

{

return 0;

}

else

{

cout << "不符合要求的字符!" << endl;

return -1;

}

} //返回字符c的優(yōu)先級(jí)

bool isNumber(char c)

{

if (c >= '0'&& c <= '9')

{

return true;

}

else

{

return false;

}

}

bool isOperator(char c)

{

if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%')

{

return true;

}

else

{

return false;

}

}

bool isBracket(char c)

{

if (c == '(' || c == ')')

{

return true;

}

else

{

return false;

}

}

double charToDouble(char c)

{

return (double)(c - '0');

}

double stringToDouble(string s)

{

return atof(s.c_str());

}

int stringToInt(string s)

{

return atoi(s.c_str());

}

char doubleToChar(double d)

{

return (char)(d + 48);

}

string doubleToString(double d)

{

return to_string(d);

}

double charBasicCalculate(char left, char op, char right)

{

if (isNumber(left) && isNumber(right))

{

if (op == '+')

{

return (charToDouble(left) + charToDouble(right));

}

else if (op == '-')

{

return (charToDouble(left) - charToDouble(right));

}

else if (op == '*')

{

return (charToDouble(left) * charToDouble(right));

}

else if (op == '/')

{

return (charToDouble(left) / charToDouble(right));

}

else if (op == '%')

{

return (left - '0') % (right - '0');

}

else

{

cout << "操作符錯(cuò)誤!";

return -1;

}

}

else

{

cout << "錯(cuò)誤運(yùn)算參數(shù)";

return -1;

}

}//返回double 的基本計(jì)算函數(shù)

double doubleBasicCalculate(double left, char op, double right)

{

if (op == '+')

{

return left + right;

}

else if (op == '-')

{

return left - right;

}

else if (op == '*')

{

return left*right;

}

else if (op == '/')

{

return left / right;

}

else if (op == '%')

{

return (int)left % (int)right;

}

else

{

cout << "操作符錯(cuò)誤!";

return -1;

}

}

double stringBasicCalculate(string left, char op, string right)

{

if (op == '+')

{

return (stringToDouble(left) + stringToDouble(right));

}

else if (op == '-')

{

return (stringToDouble(left) - stringToDouble(right));

}

else if (op == '*')

{

return (stringToDouble(left) * stringToDouble(right));

}

else if (op == '/')

{

return (stringToDouble(left) / stringToDouble(right));

}

else if (op == '%')

{

return (stringToInt(left)) % (stringToInt(right));

}

else

{

cout << "操作符錯(cuò)誤!";

return -1;

}

}

bool isExpression(const char* expression)//判斷表達(dá)式是否合法

{

int i = 0;

int leftBracket=0;//記錄左括號(hào)個(gè)數(shù)

int rightBracket=0;//記錄右括號(hào)個(gè)數(shù)

while (expression[i] != '\0')

{

if (expression[i] == ' ')

{

cout << "不要輸入空格!";

return false;

}

if (i == 0 && !(isNumber(expression[i]) || isBracket(expression[i])))//第一個(gè)元素不是數(shù)字或者左括號(hào)

{

cout << "異常1";

return false;

}

if (!(isNumber(expression[i]) || isOperator(expression[i]) || isBracket(expression[i])))//其它符合要求的字符

{

cout << "異常2";

return false;

}

if (i != 0 && isOperator(expression[i - 1]) && (isOperator(expression[i]) || expression[i] == ')'))//操作符后還是操作符或右括號(hào)不合法

{

cout << "異常3";

return false;

}

if (i!=0 && expression[i-1] == '(' && !isNumber(expression[i]))//左括號(hào)右邊不是數(shù)字debug2(i-1誤寫(xiě)i)

{

cout << "異常4";

return false;

}

else

{

if (expression[i] == '(')

leftBracket++;

if (expression[i] == ')')

rightBracket++;

}

i++;//debug1添加上i++;

}

if (leftBracket == rightBracket)

{

return true;//表達(dá)式合理

}

else

{

cout << "異常5";

return false;

}

}

string dealBasicChar(char c, int n)//c表示位上的字符,n表示位級(jí)別,234,中c=2時(shí)n=2,c=3時(shí)蟆肆,n=1,c=4時(shí)矾睦,n=0每個(gè)字符拆成0-9內(nèi)

{

string temp;

temp.append(1,c);

for (int i = 0; i < n; i++)

{

temp.append("*(9+1)");

}

/*cout << "dealBasicChar" << temp << endl;*/

return temp;

}

string dealBasicString(string s)

{

string temp;

temp.append("(");

int size = s.size();

for (int i = 0;i

{

temp.append(dealBasicChar(s.at(i), size - i - 1));

if (i != size - 1)//不是最后,添加"+";

{

temp.append("+");

}

}

temp.append(")");

/*cout << "dealBasciString" << temp << endl;*/

return temp;

}

string dealExpression(const char* expression)//化為0-9以?xún)?nèi)的表達(dá)式:23+12:(9+1+9+1+3)+(9+1+2)

{

string temp = expression;

string temp2;

string texpression;

int i=0;

while(i

{

if (i!=temp.size()-1 && isNumber(temp.at(i)) && isNumber(temp.at(i+1)))//探測(cè)是否是多位數(shù)//debug當(dāng)i=temp.size()-1時(shí)調(diào)用temp.at(i+1)發(fā)生越界,加上條件炎功,i!=temp.size()-1,當(dāng)i=temp.size()-1時(shí)由&&的處理原則,前面不成立不會(huì)執(zhí)行后面條件.

{

/*cout << i<

int j;

for ( j = 0; isNumber(temp.at(i + j)); j++)

{

temp2.append(1,temp.at(i+j));//獲得多位數(shù)存儲(chǔ)在temp2中

}

texpression.append(dealBasicString(temp2));//轉(zhuǎn)化為標(biāo)準(zhǔn)表達(dá)式并加入texpression中枚冗。

temp2.clear();//debug1:temp2為歸零導(dǎo)致錯(cuò)誤.

/*cout << texpression << endl;*/

i = i + j ;

}

else

{

texpression.append(1,temp.at(i));

i++;

}

}

/*cout << texpression<

return texpression;

}

double infixCalculate(const char* expression)//直接計(jì)算中綴表達(dá)式debug1括號(hào)括號(hào)優(yōu)先級(jí)設(shè)置出錯(cuò) OK

{

stack opStack;

stack nuStack;

for (int i = 0; expression[i] != '\0'; i++)

{

if (isNumber(expression[i]))

{

cout << "isNumber" << endl;

nuStack.push(string(1,expression[i]));//轉(zhuǎn)化為string

}

else if (isOperator(expression[i]))

{

cout << "isOperator" << endl;

if (opStack.empty())//棧為空直接將操作符壓入

{

cout << "empty()" << endl;

opStack.push(expression[i]);

}

else//區(qū)分優(yōu)先級(jí)

{

cout << "not empty()" << endl;

if (priority(opStack.top()) < priority(expression[i]))

{

cout << "priority" << endl;

opStack.push(expression[i]);

}

else

{

cout << "not priority" << endl;

char op=opStack.top();//stack.top返回頂端元素不刪除,stack.pop無(wú)返回值只刪除頂端元素

opStack.pop();

string left = nuStack.top();

nuStack.pop();

string right = nuStack.top();

nuStack.pop();

nuStack.push(doubleToString(stringBasicCalculate(left, op, right)));

opStack.push(expression[i]);

}

}

}

else if (expression[i] == '(')

{

cout << "左括號(hào)" << endl;

opStack.push(expression[i]);

}

else if (expression[i] == ')')

{

cout << "右括號(hào)" << endl;

while (1)

{

if (opStack.top() == '(')

{

opStack.pop();//彈出左括號(hào)結(jié)束

break;

}

else

{

char op = opStack.top();

opStack.pop();

string left = nuStack.top();

nuStack.pop();

string right = nuStack.top();

nuStack.pop();

nuStack.push(doubleToString(stringBasicCalculate(left, op, right)));

}

}

}

else

{

cout << "符號(hào)錯(cuò)誤!" << endl;

}

}

while (1)//計(jì)算剩余操作符

{

if (opStack.empty())

{

break;

}

else

{

char op = opStack.top();

opStack.pop();

string left = nuStack.top();

nuStack.pop();

string right = nuStack.top();

nuStack.pop();

nuStack.push(doubleToString(stringBasicCalculate(left, op, right)));

}

}

return stringToDouble(nuStack.top());

}

double postfixCalculate(const char* expression)

{

stack nuStack;

for (int i = 0; expression[i] != '\0'; i++)

{

if (isNumber(expression[i]))

{

nuStack.push(string(1, expression[i]));

}

else if (isOperator(expression[i]))

{

char op = expression[i];

string left = nuStack.top();

nuStack.pop();

string right = nuStack.top();

nuStack.pop();

nuStack.push(doubleToString(stringBasicCalculate(left, op, right)));

}

else

{

cout << "符號(hào)錯(cuò)誤!" << endl;

}

}

return stringToDouble(nuStack.top());

}

string infixTranPostfix(const char* expressionIn)

{

stack opStack;

string temp;

for (int i = 0; expressionIn[i] != '\0'; i++)

{

if (isNumber(expressionIn[i]))

{

temp.append(1, expressionIn[i]);

}

else if (isOperator(expressionIn[i]))

{

if (opStack.empty())

{

opStack.push(expressionIn[i]);

}

else

{

if (priority(opStack.top()) < priority(expressionIn[i]))

{

opStack.push(expressionIn[i]);

}

else

{

temp.append(1, opStack.top());

opStack.pop();

opStack.push(expressionIn[i]);

}

}

}

else if (expressionIn[i] == '(')

{

opStack.push(expressionIn[i]);

}

else if (expressionIn[i] == ')')

{

while (1)

{

if (opStack.top() == '(')

{

opStack.pop();

break;

}

else

{

temp.append(1, opStack.top());

opStack.pop();

}

}

}

else

{

cout << "符號(hào)錯(cuò)誤!";

}

}

while (1)

{

if (opStack.empty())

{

break;

}

else

{

temp.append(1, opStack.top());

opStack.pop();

}

}

return temp;

}

double calculate1(const char* expression)

{

if (isExpression(expression))

{

string tExpression = dealExpression(expression);

string ttExpression = infixTranPostfix(tExpression.c_str());

return postfixCalculate(ttExpression.c_str());

}

else

{

cout << "表達(dá)式錯(cuò)誤!" << endl;

}

}

double calculate2(const char* expression)

{

if (isExpression(expression))

{

string s = dealExpression(expression);

return infixCalculate(s.c_str());

}

else

{

cout << "表達(dá)式錯(cuò)誤!" << endl;

}

}

int main()

{

cout << "輸入一個(gè)表達(dá)式:" << endl;

string expression;

cin >> expression;

cout << "計(jì)算結(jié)果為:" << endl;

cout << calculate2(expression.c_str())<

/*cout << "請(qǐng)輸入表達(dá)式:" << endl;

string expression;

cin >> expression;

cout << "計(jì)算結(jié)果為:" << endl;

cout << calculate(expression.c_str())<

/*cout << "測(cè)試6:postfixCalculate" << endl; OK

string s1 = "1+2+2*3+4+(1+2*3)";

cout << infixTranPostfix(s1.c_str());*/

//5 測(cè)試 infixCalculate OK

//4 測(cè)試deal expression() Ok

/*string expression;

cin >> expression;

cout << dealExpression(expression);*/

/*char* expression;

double result;

cout << "輸入表達(dá)式:" << endl;

cin >> expression;*/

//1 測(cè)試isNumber(),isOperator(),isBracket() ?OK

//char c;

//cin >> c;

//if (isNumber(c))

//cout << "數(shù)字";

//else if (isOperator(c))

//cout << "操作符";

//else if (isBracket(c))

//cout << "括號(hào)";

//else

//cout << "其它字符";

//2 測(cè)試isExpression() ?OK

//char expression[100];

//cin >> expression;

//if (isExpression(expression))

//cout << "是表達(dá)式" << endl;

//else

//cout << "不是表達(dá)式" << endl;

//3 測(cè)試basicCalculat() ? OK

/*cout << basicCalculate('3', '%', '5');*/

/*int a = toascii('s');

int b = 's' - '0'+48;

cout << a << endl << b << endl;*/

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛇损,一起剝皮案震驚了整個(gè)濱河市赁温,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淤齐,老刑警劉巖股囊,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異更啄,居然都是意外死亡稚疹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)祭务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)内狗,“玉大人,你說(shuō)我怎么就攤上這事义锥×常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵拌倍,是天一觀的道長(zhǎng)赂鲤。 經(jīng)常有香客問(wèn)我噪径,道長(zhǎng),這世上最難降的妖魔是什么蛤袒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任熄云,我火速辦了婚禮,結(jié)果婚禮上妙真,老公的妹妹穿的比我還像新娘缴允。我一直安慰自己,他們只是感情好珍德,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布练般。 她就那樣靜靜地躺著,像睡著了一般锈候。 火紅的嫁衣襯著肌膚如雪薄料。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天泵琳,我揣著相機(jī)與錄音摄职,去河邊找鬼。 笑死获列,一個(gè)胖子當(dāng)著我的面吹牛谷市,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播击孩,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼迫悠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巩梢?” 一聲冷哼從身側(cè)響起创泄,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎括蝠,沒(méi)想到半個(gè)月后鞠抑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忌警,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年碍拆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慨蓝。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖端幼,靈堂內(nèi)的尸體忽然破棺而出礼烈,到底是詐尸還是另有隱情,我是刑警寧澤婆跑,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布此熬,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏犀忱。R本人自食惡果不足惜募谎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阴汇。 院中可真熱鬧数冬,春花似錦、人聲如沸搀庶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哥倔。三九已至秸架,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咆蒿,已是汗流浹背东抹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沃测,地道東北人缭黔。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像芽突,于是被迫代替她去往敵國(guó)和親试浙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容