括号匹配 用数据结构写 求代码

如题所述

第1个回答  推荐于2016-08-23
括号匹配一般都是要用栈来做:
所以先要构建栈在进行匹配判断
代码如下:
其中测试:
括号序列# (#代表输入一行括号结束)

输入:{[()]}#
{][}()#
输出:匹配
不匹配
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 500
#define STACKINCREMENT 50

typedef struct Stack
{
char *base;
char *top;
int stacksize;
} brackets;

int InitStack(brackets &S)
{
S.base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)
{
exit(0);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;

return 0;
}
int GetTop(brackets S,char &ch)
{
if(S.base == S.top)
{
puts("栈为空.");
return 0;
}
ch = *(S.top - 1);

return 0;
}

int Push(brackets &S,char ch)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (char *)realloc(S.base,
(S.stacksize + STACKINCREMENT)*sizeof(char));
if(!S.base)
{
exit(0);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = ch;

return 0;
}
int Pop(brackets &S)
{
if(S.top == S.base)
{
puts("空栈.");
return 0;
}
--S.top;

return 0;
}
int Judge(char *BRACK)
{
int i = 0;
char ch;
brackets S;
InitStack(S);

while(BRACK[i] != '#')
{
if(S.base == S.top)
{
if(BRACK[i] == ']' || BRACK[i] == ')' || BRACK[i] == '}')
{
printf("不匹配");
return 0;
}
else
{
Push(S,BRACK[i]);
}
}
else
{
GetTop(S,ch);
if((ch == '['&&BRACK[i] ==']') || (ch == '('&&BRACK[i] ==')')
|| (ch == '{'&&BRACK[i] =='}') )
{
Pop(S);
}
else if(BRACK[i] =='[' || BRACK[i] =='(' || BRACK[i] =='{')
{
Push(S,BRACK[i]);
}
else
{
printf("不匹配");
return 0;
}
}
i++;
}

if(S.base == S.top)
{
printf("匹配");
}
else
{
printf("不匹配");
}
return 0;
}

int main(void)
{

char BRACK[500];
while(gets(BRACK))
{
Judge(BRACK);
}
return 0;
}追问

能运行么

追答

做下小修改:

if(S.base == S.top)

{

printf("匹配\n");

}

else

{

printf("不匹配\n");

}

测试如下:

追问

存储增量写完之后的下面那段可以这么写么
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack

是char类型-_-#

brackets是什么啊

程序里面STACK_INIT_SIZE可以用500代替么

本回答被提问者采纳
相似回答