在前面“C++栈的应用——中缀转后缀”我们将我们所熟知的中缀表达式转为后缀表达式,那么如何通过后缀表达式获得原表达式的值呢?
将后缀表达式:“2963/+5-*4+”从左往右逐个字符进行遍历获得操作符,同时建立一个空栈stack。
一、当操作符为数字时,直接入栈。
二、当操作符为运算符时,取栈顶数字做右计算数值并弹出,再取一个栈顶数字做左计算数值并弹出。其与运算符做四则运算,结果入栈。
三、当遍历完成后,从栈中弹出唯一数字,该数字就是这个后缀表达式运算结果。
下面提供具体实现的代码:
1、栈的基本操作函数
/有关栈的基本操作
//节点
class linknode
{
public:
linknode* next;
};
//自定义数据
class my_data
{
public:
linknode* node;
double num;
};
//链式栈
class linkstack
{
public:
linknode head;
int size;
};
//初始化栈
linkstack* init_linkstack()
{
linkstack* stack=new linkstack;
stack->head.next=NULL;
stack->size=0;
return stack;
}
//入栈
void push_linkstack(linkstack* stack,linknode* data)
{
data->next=stack->head.next;
stack->head.next=data;
stack->size++;
}
//出栈
void pop_linkstack(linkstack* stack)
{
stack->head.next=stack->head.next->next;
stack->size--;
}
//返回栈顶元素
linknode* top_linkstack(linkstack* stack)
{
return stack->head.next;
}
2、判断函数与四则运算函数
/判断函数
//判断字符是否为数字
int isnumber(char c)
{
return c>='0' && c<='9';
}
//判断是否为运算赋
int isoperator(char c)
{
return c=='+' || c=='-' || c=='*' || c=='/';
}
//四则计算
double calculate(char c,double num1,double num2)
{
if (c=='+')
{
return num1+num2;
}
else if (c=='-')
{
return num1-num2;
}
else if (c=='*')
{
return num1*num2;
}
else if (c=='/')
{
return num1/num2;
}
else
{
cout<<"非四则运算符:"<<c<<endl;
return NULL;
}
}
3、主函数代码
int main()
{
linkstack* stack=init_linkstack();
char str[]="2963/+5-*4+";
for (int i = 0; i < sizeof(str)/sizeof(char); i++) //逐字符遍历str获得操作符;
{
my_data* data=new my_data;
data->node=NULL;
data->num=str[i]-'0';
//是数字直接进栈
if (isnumber(str[i]))
{
push_linkstack(stack,(linknode*)data);
}
//是运算符从栈中取出两数值进行计算
if (isoperator(str[i]))
{
//从栈中取出两个数据
double num1=((my_data*)top_linkstack(stack))->num; //右计算值
pop_linkstack(stack);
double num2=((my_data*)top_linkstack(stack))->num; //左计算值
pop_linkstack(stack);
//两数字num1、num2的计算结果ans
double ans=calculate(str[i],num2,num1);
//计算结果 ans入栈
my_data* res=new my_data;
res->num=ans;
push_linkstack(stack,(linknode*)res);
}
}
//在栈中取出最终结果
if (stack->size==1)
{
my_data* res=new my_data;
res=(my_data*)top_linkstack(stack);
pop_linkstack(stack);
cout<<"计算结果为:"<<res->num<<endl;
}
system("pause");
return 0;
}