当前位置:编程学习 > C/C++ >>

用C++写的中缀表达式

答案:
//Stack.cpp
#ifndef STACK_H
#define STACK_H
const int SIZE=100;
//定义栈模板类
template <class T>
class Stack{
T data[SIZE];
int top;
public:
Stack(){top=-1;};
~Stack(){}
bool isEmpty(){if(top==-1)return 1;return 0;}
void Push(T x);
T Pop();
T GetTop();
void Print();
};
//栈模板类的实现
template <class T>
void Stack<T>::Push(T x){
if(top==100)throw"上溢";
data[++top]=x;
}
template <class T>
T Stack<T>::GetTop(){
return data[top];
}
template <class T>
T Stack<T>::Pop(){
if(top==-1)throw "下溢";
return data[top--];
}
template <class T>
void Stack<T>::Print(){
while(top!=-1)
cout<<data[top--];
}

#endif

#include <iostream>
#include <string>
#include <math.h>
#include "Stack.h"
using namespace std;

int Rank(char a){//用于计算优先级
if(a=='(')
return 1;
else if(a=='+'||a=='-')
return 2;
else if(a=='*'||a=='/')
return 3;
else
return 0;//这句可以不加,加这句只为了没有警告;
}


Stack<char> OPTR;
Stack<double> OPND;//操作符和操作数栈

void Cal();//函数声明 用于计算
double Calculate(const string &s){
double result;
int len = s.size();
for(int i=0;i!=len;++i){
if(s[i]>='0'&&s[i]<='9')
if( i > 0 && s[i-1] >= '0' && s[i-1] <='9')
OPND.Push( OPND.Pop( ) * 10 + s[i]-'0' );/*如果有连续两个数字,则取出数栈中的数 * 10 再加上当前数字,
在将结果入栈*/
else
OPND.Push(s[i]-'0');
else if( s[i] == 46 && i < len -1 )
{int j,k;
for( j = i +1,k = 0;j != len && s[j] >= '0' && s[j] <= '9';++j ){
++k;//k表示有几个小数位
OPND.Push( OPND.Pop( ) + ( s[j] - '0' )/( pow(10.0,k) ) );
}
i = j - 1;//使直接跳到下一个非数值字符前
}


else if(s[i]=='(')
OPTR.Push(s[i]);
else if(s[i]==')')
{
while(OPTR.GetTop()!='(')
Cal();
OPTR.Pop();
}
else
if(Rank(s[i])>Rank(OPTR.GetTop())||OPTR.isEmpty())
OPTR.Push(s[i]);
else{
while(Rank(OPTR.GetTop())>=Rank(s[i])
&&!OPTR.isEmpty())
Cal();
OPTR.Push(s[i]);
}
}
while(!OPTR.isEmpty())
Cal();
result = OPND.Pop();
return result;
}

void Cal(){
double temp;
switch(OPTR.Pop()){
case '+':
temp=OPND.Pop();
temp=OPND.Pop()+temp;
OPND.Push(temp);break;
case '-':
temp=OPND.Pop();
temp=OPND.Pop()-temp;
OPND.Push(temp);break;
case '*':
temp=OPND.Pop();
temp=OPND.Pop()*temp;
OPND.Push(temp);break;
case '/':
temp=OPND.Pop();
temp=OPND.Pop()/temp;
OPND.Push(temp);break;
}
}

int main(){
string exp;
cout<<" 四则运算(支持实数) "<<endl;
cout<<"中缀表达式:";
cin>>exp;
cout<<exp<<'='<<Calculate(exp)<<endl;
system("pause");
return 0;
}
运行结果
四则运算(支持实数)

中缀表达式:15.8+9.5*5.7*(7-8)/56
15.8+9.5*5.7*(7-8)/56=14.833
请按任意键继续. . .
#include <cstdio>
#include <cstdlib>
#include <cstring>

class CalcInfixExp
{
public:
CalcInfixExp();
char calc(double &result, const char *s); //表达式求值
void error(const char &n); //输出错误信息
char GetOrder(char a, char b); //比较运算符优先级
bool NumPush(const double &a);
bool NumPop(double &a);
bool OpePush(const char &a);
bool OpePop(char &a);
private:
int p, //运算符栈指针
q; //操作数栈指针
char OpeStack[50];
double NumStack[50];
};

CalcInfixExp::CalcInfixExp()
{
p=q=0;
}

char CalcInfixExp::calc(double &result, const char *s)
{
char f, szA[20], order;
int i;
double a, b;
p=q=0; //清空OpeStack栈和NumStack栈
OpePush('\0');
if (*s=='+') s++;
else if (*s=='-')
{
s++;
OpePush('-');
NumPush(0.);
}
do
{
if (*s>='0' && *s<='9' || *s=='.')
{
i=0;
do szA[i++]=*s++;
while (*s>='0' && *s<='9' || *s=='.');
szA[i]='\0';
NumPush(atof(szA));
}
else
{
OpePop(f);
switch (order=GetOrder(f, *s))
{
case '<':
OpePush(f);
OpePush(*s++);
if (*s=='+') s++;
else if (*s=='-')
{
s++;
OpePush('-');
NumPush(0.);
}
break;
case '>':
//从NumStack栈中获取第二个操作数
if (q<2)
{
error('\4'); //NumStack栈已空
return false;
}
NumPop(b);

//从NumStack栈中获取第一个操作数
NumPop(a);

//计算,并把结果压入栈
switch (f)
{
case '+': NumPush(a+b); break;
case '-': NumPush(a-b); break;
case '*': NumPush(a*b); break;
case '/': NumPush(a/b);
}
break;
case '=':
s++;
break;
default:
error(order);
return false;
}
}
}while (p!=0);
NumPop(result);
if (q!=0) //操作数栈未空(操作数过多)
{
error('\5');
return false;
}
return true;
}
void CalcInfixExp::error(const char &n)
{
switch (n)
{
case '\1': printf("括号不匹配\n"); break;
case '\2': printf("右括号与左括号间没有运算符\n"); break;
case '\3': printf("低级括号内包含高级括号\n"); break;
case '\4': printf("运算符过多\n"); break;
case '\5': printf("操作数过多\n");
}
}

char CalcInfixExp::GetOrder(char a, char b)
{
static char order[11][11]={
'>','>','<','<','<','>','<','>','<','>','>',
'>','>','<','<','<','>','<','>','<','>','>',
'>','>','>','>','<','>','<','>','<','>','>',
'>','>','>','>','<','>','<','>','<','>','>',
'<','<','<','<','<','=','\3','\1','\3','\1','\1',
'>','>','>','>','\2','>','>','>','>','>','>',
'<','<','<','<','<','\1','<','=','\3','\1','\1',
'>','>','>','>','\2','\3','=','>','>','>','>',
'<','<','<','<','<','\1','<','\1','<','=','\1',
'>','>','>','>','\2','\3','\2','\3','\2','>','>',
'<','<','<','<','<','\1','<','\1','<','\1','='
};
int i[2], j=0, TreatB=0;
do
{
switch (a)
{
case '+': i[j]=0; break;
case '-': i[j]=1; break;
case '*': i[j]=2; break;
case '/': i[j]=3; break;
case '(': i[j]=4; break;
case ')': i[j]=5; break;
case '

上一个:C++指针基本类型与应用方法
下一个:哪里有免费的C++的软件

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,