后缀表达式

中缀表达式转化为后缀表达式

反思

电脑是不会骗人的,错了就是错了

起初写完,一直报错访问越界,检查了好久也没查出来,贼生气,一遍又一遍瞪着屏幕看代码,就是找不到原因,甚至怀疑是栈头文件函数写错了,改了好久还是不对,贼生气,更暴躁地看代码,还是没查出来。然后,刷csdn看到一篇教使用调试的文章,有句话 “电脑是不会不会骗人的,错了就是错了”邦邦敲醒我,于是沉下心来,在纸上一步一步地把程序执行结果写下来,一一对照,终于发现了问题。以后debug的时候也要这样!

/*
遇到一个数就输出该数
如果遇到左括号就把左括号入栈
如果遇到右括号,不断取出栈顶并输出 直到栈顶为左括号 然后左括号出栈
若遇到运算符 只要栈顶符号的优先级大于等于新符号 就不断取出栈顶并输出 最后把新符号进栈
优先级为乘除大于加减大于左括号
读完字符数组之后要让所有元素出栈 
*/ 
# include<stdio.h>
# include"Stack.h"

int main()
{
	char a[100];
	scanf("%s",a);
	Stack b,*S;
	S = &b;
	initStack(S);
	int i = 0;
	while(a[i] != '\0')
	{
		if(a[i]>='0' && a[i]<='9')//遇到一个数就输出该数
		{
			printf("%c",a[i]);
			i++;
		}
		else if(a[i] == '(')//如果遇到左括号就把左括号入栈
		{
			push(S,a[i]);
			i++;
		}
		else if(a[i] == ')')//如果遇到右括号,不断取出栈顶并输出 直到栈顶为左括号 然后左括号出栈
		{
			while(peek(S) != '(')
			{
				printf("%c",pop(S));//将左括号以上所有元素出栈并输出 
			}
			pop(S);//左括号出栈 
			i++;
		}
		else //若遇到运算符 只要栈顶符号的优先级大于等于新符号 就不断取出栈顶并输出 最后把新符号进栈   优先级为 :乘除  > 加减 > 左括号
		{
			if(a[i] == '+' || a[i] == '-')
			{
				while(!isempty(S) && peek(S) != '(') 
				{
					printf("%c",pop(S));
				}
				push(S,a[i]);
				i++;
			}
			else if(a[i] == '*' || a[i] == '/')
			{
			//	while(isempty(S) &&(peek(S) == '*' || peek(S) == '/'))
		    	while(!isempty(S) )//忘了加 ! 
				{
					if(peek(S) == '*' || peek(S) == '/')
					{
					   printf("%c",pop(S));
				    }
					else
					{
						break;
					   }   
				}
				push(S,a[i]);
				i++;
			}
		}
	}

while(!isempty(S))
	{
		//printf("%d",pop(S));//如果注释掉 输入3*(5-7)+6    输出357-*6 如果没注释掉 357-*643  43哪来的???? 写成 %d了 
		 printf("%c",pop(S));
		
	}
		
	return 0;
}
/*
3*(5-7)+6
3栈为空!栈为空!57-64342
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值