您的位置:首页 > 其它

用栈实现括号匹配的检验

2011-01-28 11:09 417 查看
根据网上的一个例子改写.

原文地址:http://blog.sina.com.cn/s/blog_4eac972c0100blyn.html

#include <Windows.h>
#include <stdio.h>
#define MAX_STACK_SIZE 10
#define INCREMENT_SIZE 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int RESULT;
typedef struct _SQSTACK_STRU
{
ElemType *pBase;	// 栈底
ElemType *pTop;		// 栈顶
int size;		// 元素个数
}SQSTACK, *PSQSTACK;
RESULT InitStack(PSQSTACK pStack)
{
pStack->pBase = (ElemType*)malloc(MAX_STACK_SIZE * sizeof(ElemType));
if (!pStack->pBase)
{
exit(OVERFLOW);
}
pStack->pTop = pStack->pBase;
pStack->size = MAX_STACK_SIZE;
return OK;
}
RESULT DestroyStack(PSQSTACK pStack)
{
free(pStack->pBase);
pStack->pBase = NULL;
pStack->pTop = NULL;
pStack->size = 0;
return OK;
}
bool IsEmptyStack(PSQSTACK pStack)
{
if (pStack->pBase == pStack->pTop)
return TRUE;
else
return FALSE;
}
RESULT push(PSQSTACK pStack, ElemType e)
{
if (pStack->pTop - pStack->pBase >= pStack->size)
{
pStack->pBase = (ElemType*)realloc(pStack->pBase, (pStack->size + INCREMENT_SIZE) * sizeof(ElemType));
if (!pStack->pBase)
exit(OVERFLOW);

pStack->pTop = pStack->pBase + pStack->size;
pStack->size += INCREMENT_SIZE;
}

*pStack->pTop++ = e;	// 每增加一个元素,栈顶位置加一,pTop永远为栈尾的下一个元素
return OK;
}
RESULT pop(PSQSTACK pStack, ElemType *pe)
{
if (pStack->pBase == pStack->pTop)	// 栈为空
return ERROR;
else
*pe = *--pStack->pTop;
return OK;
}
void main(int argc, char **argv)
{
int i = 0;
char szText[50];
char c;
SQSTACK sqstack;
bool bFlag = 1;
// 分配栈空间
if (!InitStack(&sqstack))
printf("There is no enough room./n");
printf("The stack is preparative./n");
// 读入待分析的句子
printf("Please enter sequence including some Puncts, end with '#'./n");
do{
scanf("%c", &c);
szText[i] = c;
i++;
}while (c != '#');
// 提取出句子中的括号字符,入栈出栈
i = 0;
c = szText[i];
while (c != '#' && bFlag)
{
switch (c)
{
case '(':
push(&sqstack, c);
break;
case '[':
push(&sqstack, c);
break;
case '{':
push(&sqstack, c);
break;
case ')':
pop(&sqstack, &c);	// 匹配则出栈
if (c != '(')
bFlag = 0;
break;
case ']':
pop(&sqstack, &c);
if (c != '[')
bFlag = 0;
break;
case '}':
pop(&sqstack, &c);
if (c != '{')
bFlag = 0;
break;
}
i++;
c = szText[i];
}
if (!IsEmptyStack(&sqstack)) // 如果括号全部匹配,则上述分析完成后,栈应该回归空;如果栈中仍有元素,则表明有元素未出栈,即有括号未匹配
bFlag = 0;
if (bFlag)
printf("match./n");
else
printf("no match./n");
DestroyStack(&sqstack);
}


////////////////////////////////////////////////////////////////////////////////////////////

以下用栈实现行编辑,输入'#'表示退格,输入'$'表示退行.

RESULT ClearStack(PSQSTACK pStack)
{

*pStack->pBase = '/0';
pStack->pTop = pStack->pBase;
return OK;
}
void main(int argc, char **argv)
{
int c, i = 0;
SQSTACK sqstack;
ElemType e;
InitStack(&sqstack);
while ((c = getchar()) != EOF && c!= '/n')
{
if ( c != '#' && c != '$')
{
push(&sqstack, (ElemType)c);
}
else
{
if (IsEmptyStack(&sqstack))
{
printf("There is no chars./n");
continue;
}
switch ((char)c)
{
case '#':
pop(&sqstack, &e);
break;
case '$':
ClearStack(&sqstack);
break;
}
}
}
if (!IsEmptyStack(&sqstack))
{
*(sqstack.pTop) = '/0';
printf("%s/n", sqstack.pBase);	// 注意此处的用法
}
else
{
printf("Stack is empty./n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: