3.3栈的应用

3.3栈的应用

1.括号匹配:

问题介绍:假设有两种括号,一种圆的(),一种方的【】,嵌套的顺序是任意的。

[外链图片转存失败(img-oNWeVWhE-1566221795635)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1566220099098.png)]

算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。

bool Check(char *str){
	stack s;
	InitSatack(s);
	int len = strlen(str);
	for(int i=0;i<len;++i)
	{
		char a = str[i];
		switch(a){
			case'(':
			case'[':
				Push(s,a);
				break; 
			case')':
				if(Pop(s)!='(')) //出栈顶 
				return false;  
				break;
			case']':
				if(Pop(s)!=']')
				return false;
				break; 
		} 
	} 
	if(Empty(s)) 
	return true;
	else
	return false;
}

2.表达式求值:

[外链图片转存失败(img-LW48h4WW-1566221795635)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1566220555398.png)]

后缀表达式求值:

算法思想:从左到右描述表达式的每个数字和符号,遇到数字就进栈,符号就将处于栈顶的两个数字出栈然后跟这个字符进行运算,最后将运算结果进栈,直到最终获得结果。

例子:5 20 + 1 3 * + 14 /

1.5+20=25

2.1*3=3

3.25+3=28

4.28/14=2

return 2;

//表达式求值
bool  GetElem(char *str,int data)
{
	int temp =1,sum=0,x=0,x1=0,x2=0;
    stack s;
    InitSatack(s);
    int len = strlen(str);
    for(int i=0;i<len;++i)
	{
		while('str[i]'>=0&&'str[i]'<9&&str[i]!=" "){
			sum+=temp*str[i];
			Push(sum,s);
			i++;
		}	
		switch(str[i]){
			case'+':
			Pop(x1,s);
			Pop(x2s);
			Push(x1+x2,s);
			break;
			case'-':
			Pop(x1,s);
			Pop(x2s);
			Push(x1-x2,s);
			break;
			case'*':
			Pop(x1,s);
			Pop(x2s);
			Push(x1*x2,s);
			break;
			case'/':
			Pop(x1,s);
			Pop(x2s);
			Push(x1/x2,s);
			break;
		}
	}
	data=Pop(x,s);
	return true;
}

中缀转后缀:

1.按运算符优先级对所有运算符和他的运算数加括号。(原本有括号的不用加)

2.把运算符移到对应的括号后。

3.去掉括号。

[外链图片转存失败(img-2rFi8F87-1566221795635)(assets/1566221191240.png)]

递归:

要理解递归,你要先理解递归,直到你能理解递归。

如果在一个函数、过程或数据结构的定义又应用了它自身,那么这个函数、过程或数据结构称是递归定义的,简称递归。递归最重要的是递归式和递归边界。

[外链图片转存失败(img-pO3ggbio-1566221795636)(assets/1566221720228.png)]

[外链图片转存失败(img-EOJPDBm8-1566221795636)(assets/1566221629573.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值