栈的应用实践——括号匹配的检验
2016-04-24 10:51
471 查看
目的:检验一个字符串中的大括号,中括号,小括号是否匹配。
方法:数据结构c语言版提出的期待的急迫程度描述这个问题,具体的思路为:
处于栈顶的括号总是最急迫的期待着和下一个读入的括号进行匹配
如果下一个括号可以匹配,那么栈顶括号出栈,之后新的栈顶处于最急迫的地位,或者空栈继续读入;
如果下一个括号不可以匹配栈顶,则这个括号进栈并成为新的栈顶,成为最急迫的元素,原先的急迫度则降了一级。
可以预知的是,若是字符串中括号最终可以匹配,读取所有字符后,栈将为空,可以以此作为判断的最终条件。
写的不规范之处,还请指出,见谅。
用法应该在终端下,给予命令行参数。自己测试的第二个参数字符串需要用双引号括起。
方法:数据结构c语言版提出的期待的急迫程度描述这个问题,具体的思路为:
处于栈顶的括号总是最急迫的期待着和下一个读入的括号进行匹配
如果下一个括号可以匹配,那么栈顶括号出栈,之后新的栈顶处于最急迫的地位,或者空栈继续读入;
如果下一个括号不可以匹配栈顶,则这个括号进栈并成为新的栈顶,成为最急迫的元素,原先的急迫度则降了一级。
可以预知的是,若是字符串中括号最终可以匹配,读取所有字符后,栈将为空,可以以此作为判断的最终条件。
写的不规范之处,还请指出,见谅。
//Main idea //Pushing a bracket A into a stack, //if the bracket A cannot match the bracket B in top of the stack //However,if they can match each other,not only A cannot pushed into stack //but B will be popped from the stack. #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Node { char bracket; struct Node *next; }StackNode; //define the Node of stack int emptystack(StackNode *);//Judge if it is a empty or not StackNode *push(StackNode *,char);//push a character in stack StackNode *pop(StackNode *);//pop the character that is in top StackNode *creatstack();//initalize a stack int judgecharacter(char);//judge if a character is a bracket or not int judgematching(char,char);//judge if two bracket can match each other or not int main(int argc,char *argv[]) { if (argc!=2) { printf("True Usage:bracket String\n"); exit(0); } //Make sure that there are two command line parameters StackNode *s=creatstack();//get a empty stack int i; for(i=0;i<strlen(argv[1]);i++)//string traversal { if(judgecharacter(argv[1][i]))//find bracket { //first bracket in stack,but if the string don't include any bracket, //the final outcome is that brackets are matched if(emptystack(s)) s=push(s,argv[1][i]); else { if(judgematching(s->bracket,argv[1][i])) s=pop(s); else s=push(s,argv[1][i]); } } } if(emptystack(s)) printf("Brackets are matched in this string\n"); else printf("Brackets are not matched\n"); return 0; } int emptystack(StackNode *s) { if(s->next==NULL) return 1; else return 0; } StackNode *push(StackNode *s,char e) { StackNode *new=(StackNode *)malloc(sizeof(StackNode)); new->next=s; new->bracket=e; return new; } StackNode *pop(StackNode *s) //In main function,we have considered that stack is empty //so ,now we can ignore this case { StackNode *temp=s->next; free(s); return temp; } StackNode *creatstack() //creat a empty stack which include one node { StackNode *s=(StackNode *)malloc(sizeof(StackNode)); s->next=NULL; return s; } int judgecharacter(char h) { if(h=='['||h==']'||h=='{'||h=='}'||h=='('||h==')') return 1; else return 0; } int judgematching(char w,char f) //please notice that position is different between w and f { if((w=='{'&&f=='}')||(w=='['&&f==']')||(w=='('&&f==')')) return 1; else return 0; }
用法应该在终端下,给予命令行参数。自己测试的第二个参数字符串需要用双引号括起。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++基于栈实现铁轨问题
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法