括号匹配问题
简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈顶元素出栈,继续遍历,若不能配对,则返回false。字符串遍历结束后,判断栈是否为空,若不为空返回false,若为空,返回true。以下有c和c++实现代码,用c++可以利用标准库提供的顺序容器适配器stack来实现栈结构,c语言则需要自己写栈结构,当然也可以用数组模拟栈结构,用一变量存放数组中最后面的元素的下标代表栈顶指针进行入栈出栈就可以了。
c语言版 题目来自http://nyoj.top/problem/2
1 /*
2 现在有一行括号序列,请你检查这行括号是否配对
3 输入
4 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,
5 每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。
6 数据保证S中只含有"[", "]", "(", ")" 四种字符
7 输出
8 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
9 实现:
10 栈模型实现
11 */
12 #include<stdio.h>
13 #include<stdlib.h>
14 #include<stdbool.h>
15
16 typedef struct Node * PNODE;
17
18 struct Node
19 {
20 char data;
21 PNODE pNext;
22 }NODE;
23
24 typedef struct Stack
25 {
26 PNODE pTop; //永远指向栈顶元素
27 PNODE pBottom; //永远指向栈顶元素的下一个元素
28 }STACK,* PSTACK;
29
30 /* 建立空栈 */
31 void InitStack(PSTACK pS)
32 {
33 pS->pTop = (PNODE)malloc(sizeof(NODE)); //头节点
34 pS->pBottom = pS->pTop;
35 pS->pTop->pNext = NULL; //将头节点指针域变成空的
36 }
37
38 /* 进行压栈 */
39 void PushStack(PSTACK pS,char Str)
40 {
41 PNODE pNew = (PNODE)malloc(sizeof(NODE));//建立新节点
42 pNew->data = Str; //存储数据
43 pNew->pNext = pS->pTop; //将新节点进行压栈,头进头出
44 pS->pTop = pNew; //将头节点指向新节点
45 }
46 /* 进行出栈 */
47 char PopStack(PSTACK pS)
48 {
49 PNODE p = pS->pTop; //缓存出栈的节点地址
50 char str = p->data; //缓存出栈的节点数据
51
52 pS->pTop = p->pNext;//将栈顶往后移
53 free(p);//将出栈节点销毁
54 return str; //将出栈节点数据返回
55 }
56 /* 判断栈是否为空*/
57 bool empty(PSTACK pS)
58 {
59 if(pS->pTop == pS->pBottom)
60 return true;
61 else
62 return false;
63 }
64
65 /* 扫描字符串 */
66 bool scanner(char * pStr)
67 {
68 STACK S;
69 int i = 0;
70 bool ret = true;
71
72 InitStack(&S);
73 while(*(pStr+i) != '