(编程训练)再回首,数据结构——使用栈判断括号匹配
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;
}
希望这些能提供给初学者一些参考。
在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;
}
相关文章推荐
- (编程训练)再回首,数据结构——(升级版)使用栈判断括号匹配
- (编程训练)再回首,数据结构——顺序表上的编程训练
- (编程训练)再回首,数据结构——链表上的编程训练_实现多项式运算
- (编程训练)再回首,数据结构——入队列、出队列操作
- (编程训练)再回首,数据结构——字符串操作
- (编程训练)再回首,数据结构——二维数组的操作
- (编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(递归)
- (编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)
- (编程训练)再回首,数据结构——哈夫曼编码的实现
- (编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS
- (编程训练)再回首,数据结构——二叉排序树的建立
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 数据结构(三)栈结构模拟编译器判断括号是否匹配
- 面试算法:使用堆栈判断括号的匹配
- sdutacm-数据结构实验之栈四:括号匹配
- SDUT 2134 数据结构实验之栈四:括号匹配
- 数据结构之括号匹配
- 数据结构之括号匹配
- 数据结构实验之栈四:括号匹配
- SDUT OJ 数据结构实验之栈四:括号匹配