最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在VC++6.0下可运行,当初还写了不少注释。
/*
**********************************************************
* 3-2
* 设在一个算术表达式中允许使用3种括号:圆括号"("、")",方
* 括号"["、"]",花括号"{"、"}"
* 试设计一个算法,利用栈结构来检查表达式中括号使用的合法性
* 即左、右括号是否配对
* 每对括号之间可以嵌套,但不允许交叉
**********************************************************
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*定义数据结构*/
typedef struct snode
{
char data;
struct snode *next;
}StackNode, *LinkStack;
/*初始化堆栈*/
LinkStack StackInit()
{
LinkStack s;
s = (LinkStack)malloc(sizeof(StackNode));
s->next = 0;
return s;
}
/*判断栈是否为空*/
int StackEmpty(LinkStack s)
{
if (s->next)
return 0;
else
return 1;
}
/*入栈*/
void Push(LinkStack s, char e)
{
LinkStack p;
p = (LinkStack)malloc(sizeof(StackNode));
p->data = e;
p->next = s->next;
s->next = p;
}
/*出栈*/
char Pop(LinkStack s)
{
char e;
LinkStack p;
if (StackEmpty(s))
return ('\0');
p = s->next;
s->next = p->next;
e = p->data;
free(p);
return e;
}
/*输入字符串*/
void EnterStr(char str[])
{
printf ("Input the expression string ended with'#'(length <= 80):\n");
scanf("%s", str);
}
/*输入的字符串是否匹配*/
int Judge(char str[])
{
int i = 0;
LinkStack s;
s = StackInit();
while (str[i] != '#')
{
switch (str[i])
{
case'(':
{
Push(s, '(');
i++;
break;
}
case')':
{
if ('(' == Pop(s))
{
i++;
break;
}
else
return 0;
}
case'[':
{
Push(s, '[');
i++;
break;
}
case']':
{
if ('[' == Pop(s))
{
i++;
break;
}
else
return 0;
}
case'{':
{
Push(s, '{');
i++;
break;
}
case'}':
{
if ('{' == Pop(s))
{
i++;
break;
}
else
return 0;
}
default:
{
i++;
break;
}
}
}
if (StackEmpty(s))
return 1;
else
return 0;
}
/*main函数*/
int main()
{
char next, str[80];
int flag = 1;
while(flag)
{
EnterStr(str);
if (Judge(str))
printf("Matched\n");
else
printf("Unmatched\n");
printf ("Do you want to continue?(Y/N)\n");
scanf(" %c", &next);
if ('y' == next || 'Y' == next)
flag = 1;
else
flag = 0;
}
return 0;
}