栈的学习笔记

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

Status Transform(SqStack *s1,SqStack *s2)
{
	//s1为中缀表达式,s2储存转化的后缀表达式 
	char c,data;
	printf("输入中缀表达式,以#为结束标志");	
	scanf("%c",&c);
	while(c != '#') 
	{
		if(isdigit(c))
		{
			//如果为数字压栈s2 
			pushStack(&s2,c);
		}
		else if(c == ')')
		{
			popStack(&s1,&data);
			while(data != '(')
			{
				pushStack(&s2,data);
				popStack(&s1,&data);
			}
		}
		else if('+' || '-')
		{
			//'+''-'优先级低
			if(isEmptyStack(&s1)) 
			{
				//如果为空 
				pushStack(&s2,c);
			}
			else
			{
				do
				{
					popStack(&s1,&data);
					if(data == '(')
					{
						pushStack(&s1,c);
					}
					else
					{
						pushStack(&s2,data);
					}
				}while(isEmptyStack(&s1)|| data == '(');
				pushStack(&s1,c);
			}
		}
		else if(c == '*'||c=='/'||c=='(')
		{
			pushStack(&s1,c);
		}
		else
		{
			printf("出错");
			return ERROR; 
		}
	}
}
复制代码

后缀表达式的计算

用栈来进出运算的数字

1.从左到右遍历中缀表达式的每一个数字和符号

2.若是数字,则进栈

3.若是符号,则把处于栈顶的两个数字出栈,进行运算

4.运算结果进栈

5.直到获得最终结果

Status calculate(SqStack *s2)
{
	char c=0;
	int i;
	double d,e;
	char str[20];
	c = *++(s2->base);//从栈底读取后缀表达式  
	while(c != '#')
	{
		while ( isdigit(c) || c == '.')
		{
			//过滤数字,剩下操作符 
			str[i++] = c;
			str[i] = '\0';//atof处理字符串 
			if(i >= 20){
				printf("数据过大\n");
				return ERROR; 
			}
			scanf("%c",&c);
			if( c == ' ')
			{
				//读到空格
				d = atof(str);
				pushStack(&s2, d);
				i = 0;
				break; 
			}
		}
		switch(c)
		{
			case '+':
				popStack(&s2,&e);
				popStack(&s2,&e);
				pushStack(&s2, d+e);
				break;
			case '-':
				popStack(&s2,&e);
				popStack(&s2,&d);
				pushStack(&s2, d-e);//先入栈作被减数
				break;
			case '*' :
				popStack(&s2,&e);
				popStack(&s2,&e);
				pushStack(&s2, d*e);
				break;
			case '/':
				popStack(&s2,&e);
				popStack(&s2,&e);
				if(e!=0) pushStack(&s2, d/e);
				else 
				{
					printf("除数为0");
					return ERROR;
				}
				break; 
		}
		c = *++(s2->base);	
 	}
 	c = *++(s2->base);
 	printf("计算结果为:%f\n",d);
}
复制代码

转载于:https://juejin.im/post/5ca0e919e51d4578fc153674

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值