之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。
初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器会报错。例如字符序列“(a+b)”是匹配的,而字符序列"(a+b]"则不是。
在检测括号匹配的算法中使用到了栈,算法描述如下:创建一个空栈,读取字符序列直到结尾。如果字符是开放符号'(''[''{',将其入栈;如果是一个封闭符号')'']''}',则当栈为空时报错。否则,将栈顶元素弹出。如果弹出的符号不是对应的开放符号,则报错。当字符序列结束,判断栈是否为空,为空则报错。
下面是我的实现代码:
- #include<stdio.h>
-
#include<stdlib.h>
-
#defineElementTypechar
-
typedefstructNode*PtrToNode;
-
typedefPtrToNodeStack;
-
typedefstructNode
- {
- ElementTypeElement;
- PtrToNodeNext;
- };
-
intIsEmpty(StackS);
- StackCreateStack();
-
voidDisposeStack(StackS);
-
voidMakeEmpty(StackS);
-
voidPush(ElementTypeX,StackS);
- ElementTypeTop(StackS);
-
voidPop(StackS);
-
-
intIsEmpty(StackS)
- {
-
returnS->Next==NULL;
- }
-
- StackCreateStack()
- {
-
StackS=malloc(sizeof(structNode));
-
if(S==NULL)
- {
-
printf("Noenoughmemory!");
-
returnNULL;
- }
- S->Next=NULL;
- MakeEmpty(S);
-
returnS;
- }
-
voidMakeEmpty(StackS)
- {
-
if(S==NULL)
- {
-
printf("UseCreateStackFirst!");
- }
-
else
- {
-
while(!IsEmpty(S))
- {
- Pop(S);
- }
- }
- }
-
voidPush(ElementTypeX,StackS)
- {
- PtrToNodeTmp;
-
Tmp=malloc(sizeof(structNode));
-
if(Tmp!=NULL)
- {
- Tmp->Element=X;
- Tmp->Next=S->Next;
- S->Next=Tmp;
- }
-
else
- {
-
printf("Outofspace!");
- }
- }
-
voidPop(StackS)
- {
-
-
if(IsEmpty(S))
- {
-
printf("TheStackisEmpty!");
- }
-
else
- {
- PtrToNodeTmp=S->Next;
- S->Next=Tmp->Next;
- free(Tmp);
- }
- }
- ElementTypeTop(StackS)
- {
-
if(IsEmpty(S))
- {
-
printf("Thestackisempty!");
-
return0;
- }
-
else
- {
-
returnS->Next->Element;
- }
- }
-
-
voidbalance(char*ch,StackS)
- {
- ElementTypec;
- MakeEmpty(S);
-
while((c=*ch)!='\0')
- {
-
printf("%c\n",c);
-
switch(c)
- {
-
case'(':
-
case'[':
-
case'{':
- Push(c,S);
-
break;
-
case')':
-
if(IsEmpty(S))
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
-
else
- {
-
if(Top(S)=='(')
- {
- Pop(S);
- }
-
else
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
- }
-
break;
-
case']':
-
if(IsEmpty(S))
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
-
else
- {
-
if(Top(S)=='[')
- {
- Pop(S);
- }
-
else
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
- }
-
break;
-
case'}':
-
if(IsEmpty(S))
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
-
else
- {
-
if(Top(S)=='{')
- {
- Pop(S);
- }
-
else
- {
-
fprintf(stderr,"Thesymbolsnotbalance!\n");
-
return;
- }
- }
-
break;
-
default:
-
break;
- }
- ch++;
- }
-
if(IsEmpty(S))
- {
-
fprintf(stdout,"TheSymbolsBalance!\n");
- }
-
else
- {
-
fprintf(stderr,"TheSymbolsNotBalance!\n");
- }
- }
-
intmain(void)
- {
-
charch[]="(a+b){[d]c*d}{";
- StackS=CreateStack();
- balance(ch,S);
-
return0;
- }
分享到:
相关推荐
一、实验目的 1、掌握顺序栈的类型定义...2、掌握顺序栈的简单应用。 二、实验内容 1、利用顺序栈将一个非负的十进制整数N转换为对应的B进制数。 [基本要求]非负的十进制整数N和B都从键盘输入;转换结果从屏幕输出。
C++数据结构——栈 C++数据结构 数据结构——栈 栈 最近计划再复习⼀遍数据结构,看到⼀篇博客:。 1、栈(Stack)是⼀种线性存储结构,它具有如下特点: (1)栈中的数据元素遵守"先进后出"(First In Last Out)的原则...
栈的存储,入栈的出栈
这是数据结构栈的实现的代码,对于栈的基本功能都有实现
一本通数据结构——栈的习题,很全,希望您能喜欢
用C++实现的栈操作,涉及顺序存储和链式存储。顺序存储的栈操作用类SeqStack实现,链式表存储的栈操作用LinkStack实现。main函数中做了部分测试。可根据需要继续扩充此程序。SeqStack和LinkStack可直接复制到其他...
数据结构实验——链栈数据结构实验——链栈数据结构实验——链栈数据结构实验——链栈数据结构实验——链栈数据结构实验——链栈数据结构实验——链栈
设计一个字符型的链栈;编写进栈、出栈、显示栈中全部元素的程序;设计一个选择式菜单。
广工数据结构实验——平衡二叉树 里面含有:源代码、可执行程序、说明文档
栈的C语言实现,通过C语言实现常用数据结构栈;通过动手实现栈对学习数据结构以及C语言都有很大的帮助~
了解和掌握栈的逻辑结构,掌握栈的基本算法及相关的应用
数据结构的一些讲解,供学习者参考,也顺带作为复习。需要源代码的欢迎下载,免积分,共同学习,接下来会每天分享一篇,持续一个星期
数据结构第三章笔记——栈和队列
数据结构算法——Visual.C.6.0程序集].侯识忠.清晰。 节省硬盘资源,放在这里留用。
数据结构——————KMP算法
数据结构(清华大学版)——栈和队列
#资源达人分享计划#
数据结构实验——顺序表数据结构实验——顺序表数据结构实验——顺序表数据结构实验——顺序表数据结构实验——顺序表数据结构实验——顺序表数据结构实验——顺序表
C++语言实现带小数的任意进制转换,使用了数据结构中的栈和队列,在VC++6.0上编译运行通过。对于学习C++和数据结构有一定的参考意义!