如何用C++做一个简单的计算器?要求能区分运算符优先级,例如:(12 + 3 )* 5 – 7,结果应该是68。

(1)从键盘读输入算式。
(2)可以进行加、减、乘、除运算。
(3)运算要有优先级。
(4)用户可以按任何的运算符出现顺序进行输入。
(5)不限定用户输入的计算式的长度。
(6)可以带有括号()。
(7)有排错功能,当用户输入错误的算式时提示用户。
用数组怎么做啊?指针的看不大懂

#include<iostream>
using namespace std;
#define MaxSize 100
int MaxOp=7;
struct
{
char ch;
int pri;
}
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op)
{
int i;
for(i=0;i<MaxOp;i++)
if(lpri[i].ch==op) return lpri[i].pri;
return 0;
}
int rightpri(char op)
{
int i;
for(i=0;i<MaxOp;i++)
if(rpri[i].ch==op) return rpri[i].pri;
return 0;

}
int InOp(char ch)
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else return 0;
}
int Precede(char op1,char op2)
{
if(leftpri(op1)==rightpri(op2))
return 0;
else if(leftpri(op1)<rightpri(op2))
return -1;
else return 1;
}
void trans(char *exp,char postexp[])
{
struct
{
char data[MaxSize];
int top;
}op;
int i=0;
op.top=-1;
op.top++;
op.data[op.top]='=';
while(*exp!='\0')
{
if((*exp<'0'||*exp>'9')&&(!InOp(*exp)))
{
cout<<"输入表达式不合法!"<<endl;
system("pause");
exit(0);
}
if(!InOp(*exp))
{
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
else
switch(Precede(op.data[op.top],*exp))
{
case -1:
op.top++;
op.data[op.top]=*exp;
exp++;
break;
case 0:
op.top--;
exp++;
break;
case 1:
postexp[i++]=op.data[op.top];
op.top--;
break;
}
}

while(op.data[op.top]!='=')
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
}
float compvalue(char *postexp)
{
struct
{
float data[MaxSize];
int top;
}st;
float a,b,c,d;
st.top=-1;
while(*postexp!='\0')
{
switch(*postexp)
{
case '+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case'-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case'*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case '/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a!=0)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
cout<<endl;
cout<<"除零错误!"<<endl;
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
int main()
{
cout<<"请输入表达式:"<<endl;
char exp[100];char postexp[MaxSize];
cin>>exp;
trans(exp,postexp);
cout<<"表达式的值:"<<compvalue(postexp)<<endl;
system("pause");
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-10
以前写的,参考一下吧
#include <iostream>
#include <string.h>
using namespace std;
template <class T>
class Node
{
public:
T data;
Node<T> *next;
Node()
{
this->next = NULL;
}
Node(T data,Node<T> *next=NULL)
{
this->data = data;
this->next = next;
}
};

template <class T>
class LinkedStack
{
private:
Node<T> *top;
public:
LinkedStack();
~LinkedStack();
bool isEmpty();
void push(T x);
T pop();
T get();
};

template <class T>
LinkedStack<T>::LinkedStack()
{
top = NULL;
}

template <class T>
LinkedStack<T>::~LinkedStack()
{
Node<T> *p = top;
Node<T> *q;
while(p!=top)
{
q = p;
p = p->next;
delete p;
}
top = NULL;
}

template <class T>
bool LinkedStack<T>::isEmpty()
{
return top == NULL;
}

template <class T>
void LinkedStack<T>::push(T x)
{
top = new Node<T>(x,top);
}

template <class T>
T LinkedStack<T>::pop()
{
if(!isEmpty())
{
T x = top->data;
Node<T> *p = top;
top = top->next;
delete p;
return x;
}
throw "空栈,不能执行出栈操作";
}

template <class T>
T LinkedStack<T>::get()
{
if(!isEmpty())
{
return top->data;
}
throw "空栈,不能获得栈顶元素";
}

char * toPostfix(char *expstr)
{
LinkedStack<char> stack;
char *postfix = new char[strlen(expstr)*2];
int i=0;
int j=0;
char out ;
while(expstr[i]!='\0')
{
switch(expstr[i])
{
case'+':
case'-':
while(!stack.isEmpty()&&stack.get()!='(')
{
postfix[j++] = stack.pop();
}
stack.push(expstr[i++]);
break;
case'*':
case'/':
while(!stack.isEmpty()&&(stack.get()=='*'||stack.get()=='/'))
{
postfix[j++] = stack.pop();
}
stack.push(expstr[i++]);
break;
case'(':stack.push(expstr[i++]);
break;
case')':out = stack.pop();
while(!stack.isEmpty()&&out!='(')
{
postfix[j++] = out;
out = stack.pop();
}
i++;
break;
default:
while(expstr[i]>='0'&&expstr[i]<='9'&&expstr[i]!='\0')
{
postfix[j++] = expstr[i++];
}
postfix[j++]=' ';
break;
}
}
while(!stack.isEmpty())
{
postfix[j++]=stack.pop();
}
postfix[j]='\0';
return postfix;
}

int value(char *postfix)
{
LinkedStack<int> stack;
int i=0;
int result = 0;
while(postfix[i]!='\0')
{
if(postfix[i]>='0'&&postfix[i]<='9')
{
result = 0;
while(postfix[i]!=' ')
{
result = result*10+postfix[i++]-'0';
}
i++;
stack.push(result);
}
else
{
if(postfix[i]!=' ')
{
int y = stack.pop();
int x = stack.pop();
switch(postfix[i])
{
case'+':result = x + y;
break;
case'-':result = x - y;
break;
case'*':result = x *y;
break;
case'/':result = x / y;
break;
}
stack.push(result);
}
i++;
}
}
return stack.pop();
}

int main()
{
//char *expstr = "121+10*(52-49+20)/((35-25)*2+10)";
cout << "请输入表达式:";
//char *a ;
//cin >> *a;
char expstr[20]={0};
while(1)
{
cin>>expstr;
char *postfix = toPostfix(expstr);
cout << "expstr= "<<expstr << endl;
cout << "postfix= "<<postfix<<endl;
cout << "value= "<<value(postfix) << endl;
}
return 0;
}本回答被提问者采纳