您的位置:首页 > 理论基础 > 数据结构算法

SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式

2015-01-21 20:06 351 查看


数据结构实验之栈二:一般算术表达式转换成后缀式




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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐