数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
字母直接输出,如果是符号,则比较与栈顶符号优先级大小关系,如果大于栈顶元素,则入栈,否则栈顶出栈后再入栈,注意左括号栈外优先级最高,栈内优先级最小。右括号遇到左括号前优先级最小。代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef char anytype;
struct stacks
{
struct node //链栈
{
anytype data;
struct node *next;
}*head;
stacks() //构造函数
{
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
}
bool empty() //判断空栈
{
if(head->next)
return false;
return true;
}
void push(anytype n) //入栈
{
struct node *p;
p=(struct node *)malloc(sizeof(struct node));
p->data=n;
p->next=head->next;
head->next=p;
}
void pop() //出栈
{
struct node *p;
p=head->next;
if(p)
{
head->next=p->next;
free(p);
}
}
anytype top() //查询栈顶元素
{
if(!empty())
return head->next->data;
return 0;
}
}s;
int toLevel(char ch) //返回优先级
{
switch(ch)
{
case '*':
case '/':
return 3;
case '+':
case '-':
return 2;
case '(':
if(s.top()=='(')
return 0;
return 4;
case ')':
return 1;
default:
return 0;
}
}
int main()
{
ios::sync_with_stdio(false);
string str;
char ch;
while((ch=getchar())!='#')
{
if(isalpha(ch)) //如果是字母则直接输出
str+=ch;
else
{
if(s.empty()||toLevel(ch)>toLevel(s.top())) //如果是符号,栈为空或者栈顶元素优先级小,入栈
s.push(ch);
else if(ch==')') //右括号,则左括号上的所有符号出栈,链接到待输出字符串尾
{
while(s.top()!='(')
{
str+=s.top();
s.pop();
}
s.pop();
}
else
{
str+=s.top(); //否则(优先级小于栈顶优先级),弹出栈顶元素并连接至字符串尾,该符号入栈
s.pop();
s.push(ch);
}
}
}
while(!s.empty())
{
str+=s.top(); //栈内元素全部出栈
s.pop();
}
cout<<str<<endl; //输出结果
return 0;
}