栈的应用(一)——平衡符号串的问题

文章目录



前言

大家好久不见哈~

这周我们学了栈和队列,我感觉栈和队列的实用性远远比顺序表和链表关广的多(后者是前者的基础)学习了栈和队列我感觉数据结构好像没那么枯燥了,好像挺简单的呀~(哈哈哈错觉错觉~)

每当我这么想的时候我就知道:

 好啦,玩笑过后废话不多说,接下来正式和大家分享我的小收获~

 首先我就用我自己的方式来阐述一下栈和队列的具体内容:


一、关于栈和队列的回顾

        栈是一种特殊的线性表,按照存储类型可以分为顺序栈链栈

        首先回想一下我们学过的顺序表和链表:

 

而关于栈,其实就是限制了进出方式的线性表。

对于顺序栈:可以比作为盖房时候的砖

对于链栈:   可以比作为食堂打饭是的排长队

 我们可以想象一下这两个画面:

1.工人叔叔在盖房子的时候是不是要从下往上一块一块的盖;拆房子的时候是不是也要一块一块的从上往下拆?(在我小的时候砖是很宝贵的,拆好的砖块有些还可以重复使用,nice划算~)

2.中午食堂打饭的时候,是不是排队的同学打完饭从头出去,吃饭的同学从队尾巴再排队?

好了,相信大家这么冰雪聪敏,一下就会联想到我们学的知识了——这就是栈和队列最大的特点,而用好这个特点可以让我们再处理一些实际问题时候会事倍功半。


二、平衡符号串问题


1.题目介绍

平衡符号串问题


问题:对于一串字符包括 "{"   "}"   "("   ")"  "["  "]"  "<"  ">"组成的字符串,如果每一个开头的符号"{" 都对应着"}"结束,并且在这中间字符串如"( " ")"必须有着完整的一对符号串,即每对符号串必须完整。

        示例: [( ){ <  > } ]                                                                   is  Balance symbol string

        示例: [ { <  ( )  > } ]                                                                  is  Balance symbol string

        示例: ( [ ){ <   } ]  >                                                                  is not Balance symbol string


 要求:编写程序判断输入的符号串是否为平衡符号串


2.题目分析

这个题的思路其实就是利用栈的特点,其实仔细观察我们会发现平衡的符号串有一下的特点:


 这便是问题的解决关键!

3.实验代码

#include <stdio.h>
#include <stdlib.h>

/*此处是链栈数据结构定义*/
typedef char DataType;
struct node
{
	DataType  info;
	struct node* link;
};

typedef struct node* PNode;

struct LinkStack {
	PNode  top;
};
typedef struct LinkStack* PLinkStack;


//第一关
PLinkStack createNullStack_link()
{//此处填写代码,创建一个空的链栈 

	PLinkStack s = (PLinkStack)malloc(sizeof(struct LinkStack));

	s->top = NULL;
	return s;

}

//第二关
int isNullStack_link(PLinkStack L)
{
	//判断栈是否为空,  若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1
	return (L->top == NULL);
}




//第三关
int push_link(PLinkStack L, DataType x)
{//在栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1
	PNode s = (PNode)malloc(sizeof(struct node));
	if (s == NULL) return 0;
	s->info = x;
	s->link = L->top;
	L->top = s;
	return 1;
}



//第四关
DataType pop_link(PLinkStack L)
{//弹栈并返回删除元素,若栈为空,则返回-1
	if (L->top == NULL) return -1;
	int t = L->top->info;
	PNode p = L->top;
	L->top = L->top->link;
	free(p);
	return t;
}

//第五关
DataType top_link(PLinkStack L)
{// 取栈顶元素返回,若栈为空,则返回-1
	if (L->top == NULL) return -1;
	int t = L->top->info;
	return t;
}


//销毁栈,释放栈所占存储空间
int destroystack_link(PLinkStack L)
{
	//返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0
	int cnt = 0;
	if (L == NULL) return 0;
	struct node* p = L->top, * q;
	free(L);
	while (p->link != NULL)
	{
		q = p->link;
		cnt++;
		free(p);
		p = q;
	}
	return cnt;
}

//第六关

int  balance_symbol(char* s)
{//在此处填写代码完成符号配对判断,若配对,返回值为1,否则返回值为0
	int i = 0;
	PLinkStack kk = createNullStack_link();
	while (s[i]!='\0')
	{
		if (s[0] == ']' || s[0] == ')' || s[0] == '}' || s[0] == '>')return 0;
		switch (s[i])
		{
		case '{':push_link(kk, '}'); break;
		case '[':push_link(kk, ']'); break;
		case '(':push_link(kk, ')'); break;
		case '<':push_link(kk, '>'); break;
		}
		i++;
		//if (s[i] == '}' || s[i] == ')' || s[i] == '>' || s[i] == ']')
		//{
			if (kk->top != NULL && kk->top->info == s[i])
				pop_link(kk);
		//}	
	}
	if (kk->top==NULL) return 1;
	else return 0;
}
int main(void)
{
	int m, x;
	char s[200];
	gets_s(s);
	printf("%d", balance_symbol(s));
}


总结

最近学委的事情好多,这个断断续续写了一星期才完成,有些地方太过仓促。如果哪里有不正确的地方,欢迎大佬指正~

数据结构,我一定要拿下你!

筚路蓝缕,与君共勉。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值