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

define MAX 100004//分配初始内存大小

define num 10000//每次增加内存大小

typedef int ET;//定义ET代表int
typedef struct
{
ET *base;
ET *top;
int size;
}stack;
void Init(stack *s) //创建一个初始的栈
{
s -> base = (ET*)malloc(MAX * sizeof(ET));//给栈申请初始空间
if(!s->base)//如果申请失败
exit(0);
s->top = s -> base;
s -> size = MAX;
}
void Push(stack *s, int e )//入栈函数
{
if(s -> top - s -> base >= s -> size)//如果栈已经满了,追加栈容量
{
s -> base = (ET*)realloc(s -> base,(s -> size+num)*sizeof(ET));
if(!s -> base)
exit(0);
s -> top = s -> base;
s -> size =s ->size + num;
}
*s -> top = e; //数据入栈
s -> top++;//栈顶指针上移,始终始终指向栈顶
}
int zhuan(char n)//吧运算符按优先级大小转成数字
{
int a;
if(n==’#’) a=0;
if(n==’(‘) a=1;
if(n==’+’||n==’-‘) a=2;
if(n==’*’||n==’/’) a=3;
if(n==’)’) a=4;
return a;
}
char Pop(stack *s)//出栈函数
{
char r;
r = *(s -> top-1);//指出出栈字符
s -> top–;//栈顶指针下移
return r;
}
void transfer(stack *s,char n)
{
if(n == ‘(‘)//(优先级相对最低,可以直接入栈;
Push(s,n);
else
if(n == ‘)’)//)的优先级最高,无法直接入栈,要找到与其对应的(,使其出栈
{
while(1)//一直循环,终止条件见下
{
if(*(s -> top-1) ==’(‘)//如果找到(就可以使其出栈,退出循环
{
Pop(s);
break;
}
else
printf(“%c”,Pop(s));//如果不是(就弹出元素,直到(
}
}
else
if(zhuan(*(s -> top -1)) < zhuan(n))//入栈的优先级高于栈顶元素,直接入栈
Push(s,n);
else
if(zhuan(*(s-> top-1)) >= zhuan(n))//否则弹出栈顶元素,然后入栈
{
printf(“%c”,Pop(s));
Push(s,n);
}
}
void show(stack *s)
{
while(s ->top > s -> base)
{
if(*(s -> top -1) != ‘#’)
{
printf(“%c”,*(s -> top-1));
s -> top–;
}
else
s -> top–;
}
printf(“\n”);
}
int main()
{
stack s;
char n;
Init(&s);
Push(&s,’#’);
while(scanf(“%c”,&n) != EOF && n != ‘#’)
{
if(n >= ‘a’ && n <= ‘z’)
printf(“%c”,n);
else
transfer(&s,n);
}
show(&s);//输出栈内字符
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值