terry182
【绝对新手向】整数型五则运算方法和解说

先说一下,什么是五则运算,就是在 加减乘除 的基础上面 ,再加上 %,也就是余 【就是求余数啊喂!】

输入的是一条标准的运算式,比如:2*(3+4)*5

注意一下是包含括号的,还有先乘除後加減以及() 優先運算的計算規則

【P.S. %是和乘除一个等级的

整数型 也就是说里面的任何运算都不可以出现非整数的数字,不然会是错误的哟亲 (好吧我是懒得改成浮点数的)】

以下就是程式的代码

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

using namespace std;

int sti(string a)

{stringstream b;

int k;

b << a;

b >> k;

return k;

}

int isopr(char c)

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

{return 1;}

else

return 0;

}

int check(char c)

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

{return 3;}

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

{return 2;}

else

return 0;

}

void caculate (string a)

{int i,m,n;

stack *本站禁止HTML标签噢* Numstack;

for (i=0;i<a.length();i++)

{if (isdigit(a *本站禁止HTML标签噢* ))

{string c;

while (isdigit(a *本站禁止HTML标签噢* ))

{c+=a *本站禁止HTML标签噢* ;

i++;}

Numstack.push(sti(c));

}

if (isopr(a *本站禁止HTML标签噢* ))

{if (a *本站禁止HTML标签噢* =='+')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(m+n);

}

if (a *本站禁止HTML标签噢* =='-')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n-m);

}

if (a *本站禁止HTML标签噢* =='*')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(m*n);

}

if (a *本站禁止HTML标签噢* =='/')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n/m);

}

if (a *本站禁止HTML标签噢* =='%')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n%m);

}

}

}

cout << Numstack.top() << endl;

}

int main(){

stack *本站禁止HTML标签噢* Oprstack;

string a,b;

int i;

while (getline(cin,a))

{

Oprstack.push('!');

for (i=0;i<a.length();i++)

{if(isdigit(a *本站禁止HTML标签噢* ))

{ while (isdigit(a *本站禁止HTML标签噢* ))

{ b+=a *本站禁止HTML标签噢* ;

i++;}

b+=' ';

}

if(a *本站禁止HTML标签噢* =='(')

{Oprstack.push(a *本站禁止HTML标签噢* );}

if (a *本站禁止HTML标签噢* ==')')

{while (Oprstack.top()!='(')

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();

}

Oprstack.pop();

}

if(isopr(a *本站禁止HTML标签噢* ))

{if (check(a *本站禁止HTML标签噢* )>check(Oprstack.top()))

{Oprstack.push(a *本站禁止HTML标签噢* );

}

else if (check(a *本站禁止HTML标签噢* )<=check(Oprstack.top()))

{while (check(a *本站禁止HTML标签噢* )<=check(Oprstack.top()))

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();

}

Oprstack.push(a *本站禁止HTML标签噢* );

}

}

}

while(Oprstack.top()!='!')

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();}

caculate(b);

}

return 0;

}[/mw_shl_code]

terry182
别疯狂啊少年
展开Biu

老实猫 发表于 2012-8-11 19:35

别疯狂啊少年

[查看全文]
老实猫
terry182
是啊是啊
展开Biu

老实猫 发表于 2012-8-11 19:16

是啊是啊,肿么弄的

回复那里那个 <> 的符号就是了

[查看全文]
老实猫
你说的代码格式是这个么
展开Biu

terry182 发表于 2012-8-11 18:57

[mw_shl_code=cpp,true]#include

using namespace std;

int main() //你说的代码格式是这个么

是啊是啊,肿么弄的:84:

[查看全文]
terry182
本帖最后由
展开Biu

本帖最后由 terry182 于 2012-8-11 19:02 编辑

老实猫 发表于 2012-8-11 12:03

@ 我又不告诉我怎么弄这个代码格式,随便TX人不好哟少年!

有点眼花,要是每一段加点说明就好了

非常基础 ...

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

using namespace std;

int main() //你说的代码格式是这个么

{cout << "Hello World!" << endl;

system("pause");

return 0;

}[/mw_shl_code]

[查看全文]
老实猫
我又不告诉我怎么弄这个代码格式
展开Biu

terry182 发表于 2012-8-10 21:36

@老实猫

@ 我又不告诉我怎么弄这个代码格式,随便TX人不好哟少年!

有点眼花,要是每一段加点说明就好了

非常基础透彻的算法,适合演练。但是其实实用来说不用这么麻烦,我的方法是连数据库直接select 这个字符串算式 from dual 用orcale可行,大概连个excel也行的,excel功能强大,几乎所有电脑都会装

stringstream没用过,我用strtoint,加一个try,万一出错返回错误信息

继续求怎么弄这个代码格式啊#7024!

[查看全文]
轻舟过
很有用呢
展开Biu

terry182 发表于 2012-8-10 23:40

是的 很有用呢

其实思想挺简单的,不过确实很有用

[查看全文]
terry182
原来中文叫调度场算法
展开Biu

轻舟过 发表于 2012-8-10 23:39

shunting yard algorithm原来中文叫调度场算法

是的 很有用呢

[查看全文]