最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在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; }
时间: 2024-12-25 01:21:48