/*
Check if parenthesis ( ), brackets [ ], and braces { } are balanced.
栈的应用————平衡符号
*/
/*
栈的两种实现方式:链式存储和顺序存储(数组)。栈的一个主要应用是平衡符号。
初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就
是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检
查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译
器是能够通过的。否则编译器会报错。例如字符序列“(a+b)”是匹配的,而字符序
列"(a+b]"则不是。
在检测括号匹配的算法中使用到了栈.
算法描述如下:创建一个空栈,读取字符序列直到结尾。如果字符是开放符号
'(''[''{',将其入栈;如果是一个封闭符号')'']''}',则当栈为空时报错。
否则,将栈顶元素弹出。如果弹出的符号不是对应的开放符号,则报错。当字
符序列结束,判断栈是否为空,为空则报错。
*/
#include <stdio.h>
#include <stdlib.h>
#define ElementType char
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef struct Node
{
ElementType Element;
PtrToNode Next;
};
/*
//栈的链表实现-方法二
struct Node {
char Element;
struct Node *next;
};//栈的链表实现
typedef struct Node *Stack;
*/
int IsEmpty(Stack S);
Stack CreateStack();
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
void DisposeStack(Stack S);
void CheckSymbol(char *ch, Stack S);
//判断栈是否为空
int IsEmpty(Stack S)
{
return S->Next == NULL;
}
//创建链栈
Stack CreateStack(void)
{
Stack S;
S = malloc(sizeof(struct Node));
if (S == NULL)
{
printf("No enough memory!");
return NULL;
}
S->Next = NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if (S == NULL)
{
printf("Use CreateStack First!");
}
else
{
while (!IsEmpty(S))
{
Pop(S);
}
}
}
void Push(ElementType X, Stack S)
{
PtrToNode TmpCell;
TmpCell = malloc(sizeof(struct Node));
if (TmpCell != NULL)
{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
else
{
printf("Out of space!");
}
}
void Pop(Stack S)
{
PtrToNode FirstCell;
if (IsEmpty(S))
{
printf("The Stack is Empty!");
}
else
{
FirstCell = S->Next;
S->Next = FirstCell->Next;
free(FirstCell);
}
}
ElementType Top(Stack S)
{
if (IsEmpty(S))
{
printf("The stack is empty!");
return 0;
}
else
{
return S->Next->Element;
}
}
void DisposeStack(Stack S)
{
if (S == NULL)
printf("no stack");
MakeEmpty(S);
free(S);
}
//平衡符号判断
void CheckSymbol(char *ch, Stack S)
{
printf("%s\n", ch);
ElementType c;
MakeEmpty(S);
while ((c = *ch) != '\0')
{
switch (c)
{
case '(':
case '[':
case '{':
Push(c, S);
break;
case ')':
if (IsEmpty(S))
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
else
{
if (Top(S) == '(')
{
Pop(S);
}
else
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
}
break;
case ']':
if (IsEmpty(S))
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
else
{
if (Top(S) == '[')
{
Pop(S);
}
else
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
}
break;
case '}':
if (IsEmpty(S))
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
else
{
if (Top(S) == '{')
{
Pop(S);
}
else
{
fprintf(stderr, "The symbols not balance!\n");
return;
}
}
break;
default:
break;
}
ch++;
}
if (IsEmpty(S))
{
fprintf(stdout, "The Symbols Balance!\n");
}
else
{
fprintf(stderr, "The Symbols Not Balance!\n");
}
}
int main(void)
{
char ch[] = "(a+b){[dc*d}";
Stack S = CreateStack();
CheckSymbol(ch, S);
DisposeStack(S);
getchar();
return 0;
}