您的位置:首页 > 其它

C实例---括号匹配(栈实现)

2017-02-09 16:00 411 查看
代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define     STACKSIZE       100
typedef     char             ElemType;

typedef struct stack
{
ElemType *base;
ElemType *top;
int stacksize;
}SeqStack;

void InitialStack(SeqStack *Stack)
{
if ((Stack->base = (ElemType *)malloc(STACKSIZE * sizeof(ElemType))) == NULL)
{
printf("Line %d : Stack malloc error!\n",__LINE__);
exit(1);
}
Stack->top = Stack->base;
Stack->stacksize = STACKSIZE;
}

int IsEmpty(SeqStack *Stack)
{
if (Stack->top == Stack->base)
return 1;
else
return 0;
}

int IsFull(SeqStack *Stack)
{
if ((Stack->top - Stack->base) == (STACKSIZE - 1))
return 1;
else
return 0;
}

void Push(SeqStack *Stack, ElemType data)
{
if (IsFull(Stack))
{
printf("Line %d : Stack Overflow!\n",__LINE__);
exit(2);
}
*(Stack->top ++) = data;
}

void Pop(SeqStack *Stack)
{
if (IsEmpty(Stack))
{
printf("Line %d : Stack overflow!\n",__LINE__);
exit(3);
}
-- Stack->top;
}

ElemType Top (SeqStack *Stack)
{
if (IsEmpty(Stack))
{
printf("Line %d : Stack is empty!\n",__LINE__);
exit(4);
}
return *(Stack->top - 1);
}

int Match(SeqStack *Stack, char *str)
{
char x;
int i, flag = 1;
for (i = 0; str[i] != '\0'; i ++)
{
switch (str[i]) {
case '(':
Push(Stack, '(');
break;
case '[':
Push(Stack, '[');
break;
case '{':
Push(Stack, '{');
break;
case ')':
x = Top(Stack);
Pop(Stack);
if (x != '(')
flag = 0;
break;
case ']':
x = Top(Stack);
Pop(Stack);
if (x != '[')
flag = 0;
break;
case '}':
x = Top(Stack);
Pop(Stack);
if (x != '{')
flag = 0;
break;

default:
break;
}
}
if (IsEmpty(Stack) == 1 && flag)
return 1;
else
return 0;
}

int main()
{
SeqStack *Stack;
char *stt = "(16*32) - {[(x-1)]}";
printf("String : %s\n",stt);
InitialStack(Stack);
if (Match(Stack, stt))
printf("Matching\n");
else
printf("No Matching\n");

return 0;
}


运行结果:

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