您的位置:首页 > 理论基础 > 数据结构算法

(编程训练)再回首,数据结构——使用栈判断括号匹配

2015-05-28 11:17 423 查看
       最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。

       希望这些能提供给初学者一些参考。
 
      在VC++6.0下可运行,当初还写了不少注释。
 
/*
**********************************************************
* 3-2
* 输入任一表达式,“#”为表达式的结束符,试写一判断式中
* 圆括号("(", ")")是否配对的算法。
**********************************************************
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*数据类型*/
typedef struct snode
{
char data;
struct snode *next;
}StackNode;

typedef StackNode *LinkStack;

/*初始化堆栈*/
LinkStack StackInit()
{
LinkStack s;
s = (LinkStack)malloc(sizeof(StackNode));
s->next = 0;
return s;
}

/*判断栈s是否为空*/
int StackEmpty (LinkStack s)
{
if (s->next)
return 0;
else
return 1;
}

/*进栈*/
void Push (LinkStack s, char e)
{
LinkStack p;
p = (StackNode *)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');
else
{
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;
}
default:
i++;
break;
}
if (StackEmpty(s))
return 1;
else
return 0;
}

/*main函数*/
int main()
{
char ch, str[80];
int flag = 1;
while (flag)
{
EnterStr(str);
if (Judge(str))
printf ("Matched\n");
else
printf ("Unmatched\n");
printf ("\n Do you want to continue?(Y/N):\n");
scanf (" %c", &ch);
//scanf ("%c", &ch);
if ('n' == ch || 'N' == ch)
flag = 0;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构