前言
大家好久不见哈~
这周我们学了栈和队列,我感觉栈和队列的实用性远远比顺序表和链表关广的多(后者是前者的基础)学习了栈和队列我感觉数据结构好像没那么枯燥了,好像挺简单的呀~(哈哈哈错觉错觉~)
每当我这么想的时候我就知道:
好啦,玩笑过后废话不多说,接下来正式和大家分享我的小收获~
首先我就用我自己的方式来阐述一下栈和队列的具体内容:
一、关于栈和队列的回顾
栈是一种特殊的线性表,按照存储类型可以分为顺序栈和链栈。
首先回想一下我们学过的顺序表和链表:
而关于栈,其实就是限制了进出方式的线性表。
对于顺序栈:可以比作为盖房时候的砖
对于链栈: 可以比作为食堂打饭是的排长队
我们可以想象一下这两个画面:
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));
}
总结
最近学委的事情好多,这个断断续续写了一星期才完成,有些地方太过仓促。如果哪里有不正确的地方,欢迎大佬指正~
数据结构,我一定要拿下你!
筚路蓝缕,与君共勉。