您的位置:首页 > 其它

算法分析——括号匹配

2011-09-10 21:04 399 查看
括号匹配问题是指要匹配一个字符串的左,右括号:
括号问题可以用来解决C语言中的“{”和“}”的匹配问题,可以观察到,如果从左至右扫描一个字符串,

那么每个右括号将于最近遇到的那个未匹配的左括号相匹配,在从左至右的扫描工程中把所遇到的左括号

存放到堆栈内,每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该

左括号
以下是完整的C程序,该算法的时间复杂性为O(n),其中n为输入串的长度:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#define StackSize 100   //假定预分配的栈空间最多为100个元素
#define MaxLength 100   //最大的字符串长度

typedef int DataType;   //假定栈元素的数据类型为整数
typedef struct
{
DataType data[StackSize];
int top;
}SeqStack;

void Initial(SeqStack *S);
int IsEmpty(SeqStack *S);
int IsFull(SeqStack *S);
void Push(SeqStack *S, DataType x);
DataType Pop(SeqStack *S);
DataType Top(SeqStack *S);
void PrintMatchedPairs(char *expr);

void main(void)
{
char expr[MaxLength];
printf("请输入符号个数小于%d的表达式:\n",MaxLength);

gets(expr);

printf("括号对是:\n");

PrintMatchedPairs(expr);

return;
}

//置栈空
void Initial(SeqStack *S)
{
S -> top = -1;
}

//判断栈是否空
int IsEmpty(SeqStack *S)
{
return S -> top == -1;
}

//判断栈是否满
int IsFull(SeqStack *S)
{
return S -> top == StackSize -1;
}

//进栈
void Push(SeqStack *S, DataType x)
{
if(IsFull(S))
{
printf("栈上溢!");
exit(1);
}

S -> data[++ S -> top] = x;

return;
}

//出栈
DataType Pop(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空!");
return -1;
}

return S -> data[S -> top--]; //栈顶指针加1后将x入栈
}

//取栈顶元素
DataType Top(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空!");
exit(1);
}

return S -> data[S -> top];
}

//括号匹配
void PrintMatchedPairs(char *expr)
{
SeqStack S;
int i , j , length = strlen(expr);

Initial(&S);

for(i = 1 ; i <= length ; i++)
{
if(expr[i - 1] == '(')
{
Push(&S,i);
}
else if(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);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: