最近开始复习数据结构,把书上的一些例子动手写一下。
括号匹配检验:假设表达式中允许包含两种括号,"()[]",任意嵌套,检查格式是否正确。
/************************************************************************/
/* 括号匹配的检验 */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ElemType char
typedef struct {
ElemType *base;
ElemType *top;
int stacksize;
} Stack;
bool InitStack(Stack &S);//初始化栈
int StackLength(Stack S);//栈大小
bool GetTop(Stack S,ElemType &e);//返回栈顶元素
bool Push(Stack &S,ElemType e);//入栈
bool Pop(Stack &S,ElemType &e);//出栈
bool StackEmpty(Stack S);
//
bool StackEmpty(Stack S)
{
if (S.base == S.top)
{
return true;
}
return false;
}
bool InitStack(Stack &S)
{
S.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if (!S.base)
{
return false;
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
int StackLength(Stack S)
{
int ssize = S.top - S.base;
if(ssize >= 0)
return ssize/sizeof(ElemType);
return -1;
}
bool GetTop(Stack S,ElemType &e)
{
if (S.base == S.top)
{
return false;
}
e = *(S.top-1);
return true;
}
bool Push(Stack &S,ElemType e)
{
if (S.top - S.base >= S.stacksize)
{
S.base = (ElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(ElemType));
if (!S.base)
{
return false;
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return true;
}
bool Pop(Stack &S,ElemType &e)
{
if (S.top == S.base)
{
return false;
}
e = *--S.top;
return true;
}
//括号检测
void BracketCheck()
{
Stack S;
InitStack(S);
char ch = ' ',topch = ' ';
// scanf("%c",&ch);
// getchar();
ch=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/
putchar(ch); /*输出该字符*/
Push(S,ch);
while (ch != '#')
{
// scanf("%c",&ch);
// getchar();
ch=getch();
putchar(ch);
if (ch != '(' && ch != ')' && ch != '[' && ch != ']')
continue;
if (!StackEmpty(S))
GetTop(S,topch);
if (topch == '('&& ch == ')' || topch == '['&&ch == ']')
{
Pop(S,topch);
}
else
{
Push(S,ch);
}
}
if (Pop(S,topch) && topch == '#' && !Pop(S,topch));//栈里仅剩'#'一个元素,pop之。
if (StackEmpty(S))
printf("the sequence is correct!\n");
else
printf("the sequence is error!\n");
}
void main()
{
BracketCheck();
}