8、数据结构笔记之八栈的应用之括号匹配检验实现
“人生的意义就在这个过程上。你要细细体认和玩味这个过程中的每节,无论它是一节黄金或一节铁;你要认识每节的充分价值。”
1. 括号匹配问题
括号匹配问题是指要匹配一个字符串的左,右括号:括号问题可以用来解决C语言中的“{”和“}”的匹配问题,可以观察到,如果从左至右扫描一个字符串,那么每个右括号将于最近遇到的那个未匹配的左括号相匹配,在从左至右的扫描工程中把所遇到的左括号存放到堆栈内,每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。
在编译器中适用很多,此外括号匹配问题和栈的特性非常吻合。
2. 结构定义
定义栈的最大空间为100,可以存放100个左右括号
#defineStackSize100 //假定预分配的栈空间最多为100个元素
#defineMaxLength100 //最大的字符串长度
typedefintDataType; //假定栈元素的数据类型为整数
typedefstruct
{
DataTypedata[StackSize];
inttop;
}SeqStack;
其中结构体中定义了一个数组,一个整型。数组模拟堆栈,整型表示堆的TOP指针。
3. 初始化堆
设置top为-1,因为数组是从0开始的。
void Initial(SeqStack *S)
{
S-> top = -1;
}
4. 判断栈是否空满
通过结构体中的top来判断是否为空为满
//判断栈是否空
int IsEmpty(SeqStack *S)
{
returnS-> top == -1;
}
//判断栈是否满
int IsFull(SeqStack *S)
{
returnS-> top == StackSize -1;
}
5. 进栈出栈
进栈判断是否为满,出栈判断是否为空。
进栈将top值加1,出栈将top 值减1.
//进栈
void Push(SeqStack *S, DataTypex)
{
if(IsFull(S))
{
printf("栈上溢!");
exit(1);
}
S-> data[++ S -> top] = x;
return;
}
//出栈
DataType Pop(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空!");
return-1;
}
returnS-> data[S -> top--];
}
6. 括号匹配
出现(,则压入栈,出现)则出栈,同时判断弹出的top值是否为-1. 如果为1,说明)括号多了,弹不出(括号了。最后判断栈是否为空,如果不为空,则说明有多余的(符号。
//括号匹配
void PrintMatchedPairs(char *expr)
{
SeqStackS;
int i, j , length = strlen(expr);
Initial(&S);
for(i= 1 ; i <= length ; i++)
{
if(expr[i- 1] == '(')
{
Push(&S,i);
}
elseif(expr[i- 1] == ')')
{
j= Pop(&S);
if(j== -1)
{
printf("没有对应第%d个右括号的左括号\n", i);
}
else
{
printf("%d %d\n",i,j);
}
}
}
while(!IsEmpty(&S))
{
j =Pop(&S);
printf("没有对应第%d个左括号的右括号\n", j);
}
}
7. 源码
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#defineStackSize100 //假定预分配的栈空间最多为100个元素
#defineMaxLength100 //最大的字符串长度
typedefintDataType; //假定栈元素的数据类型为整数
typedefstruct
{
DataTypedata[StackSize];
inttop;
}SeqStack;
//置栈空
void Initial(SeqStack *S)
{
S-> top = -1;
}
//判断栈是否空
int IsEmpty(SeqStack *S)
{
returnS-> top == -1;
}
//判断栈是否满
int IsFull(SeqStack *S)
{
returnS-> top == StackSize -1;
}
//进栈
void Push(SeqStack *S, DataTypex)
{
if(IsFull(S))
{
printf("栈上溢!");
exit(1);
}
S-> data[++ S -> top] = x;
return;
}
//出栈
DataType Pop(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空!");
return-1;
}
returnS-> data[S -> top--];
}
//取栈顶元素
DataType Top(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空!\n");
exit(1);
}
returnS-> data[S -> top];
}
//括号匹配
void PrintMatchedPairs(char *expr)
{
SeqStackS;
int i, j , length = strlen(expr);
Initial(&S);
for(i= 1 ; i <= length ; i++)
{
if(expr[i- 1] == '(')
{
Push(&S,i);
}
elseif(expr[i- 1] == ')')
{
j= Pop(&S);
if(j== -1)
{
printf("没有对应第%d个右括号的左括号\n", i);
}
else
{
printf("%d %d\n",i,j);
}
}
}
while(!IsEmpty(&S))
{
j =Pop(&S);
printf("没有对应第%d个左括号的右括号\n", j);
}
}
void main(void)
{
charexpr[MaxLength];
printf("输入符号个数小于%d的表达式:\n",MaxLength);
gets(expr);
printf("括号匹配:\n");
PrintMatchedPairs(expr);
return;
}