您的位置:首页 > 其它

一个简易的计算器程序

2014-08-06 19:57 183 查看


/*记得数据结构老师说过可以一边进行中缀表达式的后缀转换
/* 一边进行计算器的运算,今天无聊就把这个大体实现了一下
/*不过还有一些问题:1.还不能支持所有的数据类型
/*     2.对于多位数处理还有BUG
/*     3.对于右结合性的运算符还没有实现   */
/*先这样吧 有时间再改 */
#include<stdio.h>
#include<ctype.h>
#include<stack>
using namespace std;
stack<char> s;
stack<int> s2;

int calculate_mark(char a); //判断运算符优先级
void calculate(char *p);  //栈的实现部分
void calculate_stack(char b); //数值的加减乘除处理

int calculate_mark(char a)
{
switch(a)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 3;
default:
{
printf("运算符错误或不存在!");
exit(1);
}
}
}
void calculate_stack(char b)
{
int num1,num2,num3;
num1=s2.top();
s2.pop();
num2=s2.top();
s2.pop();
if(b=='+')
num3=num1+num2;
else if(b=='-')
num3=num2-num1;
else if(b=='*')
num3=num1*num2;
else if(b=='/')
num3=num2/num1;
s2.push(num3);
}
void calculate(char *p)
{
while(*p)
{
if(isdigit(*p))
s2.push(*p-'0');
else
{
if(s.empty())
s.push(*p);
else if(*p==')')
{
while(s.top()!='(')
{
calculate_stack(s.top());
s.pop();
}
s.pop();
}
else if(*p=='(')
{
s.push(*p);
}
else if(calculate_mark(s.top())<calculate_mark(*p))
s.push(*p);
else if(calculate_mark(s.top())>=calculate_mark(*p))
{
while(!s.empty()&&s.top()!='('&&calculate_mark(s.top())>=calculate_mark(*p))
{
calculate_stack(s.top());
s.pop();
}
s.push(*p);
}

}
p++;
}
while(!s.empty())
{
calculate_stack(s.top());
s.pop();
}
}
int main()
{
char *p="3*(6+1)-4/2+6";
calculate(p);
printf("%d\n",s2.top());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: