算法分析——括号匹配
2011-09-10 21:04
399 查看
括号匹配问题是指要匹配一个字符串的左,右括号:
括号问题可以用来解决C语言中的“{”和“}”的匹配问题,可以观察到,如果从左至右扫描一个字符串,
那么每个右括号将于最近遇到的那个未匹配的左括号相匹配,在从左至右的扫描工程中把所遇到的左括号
存放到堆栈内,每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该
左括号
以下是完整的C程序,该算法的时间复杂性为O(n),其中n为输入串的长度:
括号问题可以用来解决C语言中的“{”和“}”的匹配问题,可以观察到,如果从左至右扫描一个字符串,
那么每个右括号将于最近遇到的那个未匹配的左括号相匹配,在从左至右的扫描工程中把所遇到的左括号
存放到堆栈内,每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该
左括号
以下是完整的C程序,该算法的时间复杂性为O(n),其中n为输入串的长度:
#include "stdio.h" #include "string.h" #include "stdlib.h" #define StackSize 100 //假定预分配的栈空间最多为100个元素 #define MaxLength 100 //最大的字符串长度 typedef int DataType; //假定栈元素的数据类型为整数 typedef struct { DataType data[StackSize]; int top; }SeqStack; void Initial(SeqStack *S); int IsEmpty(SeqStack *S); int IsFull(SeqStack *S); void Push(SeqStack *S, DataType x); DataType Pop(SeqStack *S); DataType Top(SeqStack *S); void PrintMatchedPairs(char *expr); void main(void) { char expr[MaxLength]; printf("请输入符号个数小于%d的表达式:\n",MaxLength); gets(expr); printf("括号对是:\n"); PrintMatchedPairs(expr); return; } //置栈空 void Initial(SeqStack *S) { S -> top = -1; } //判断栈是否空 int IsEmpty(SeqStack *S) { return S -> top == -1; } //判断栈是否满 int IsFull(SeqStack *S) { return S -> top == StackSize -1; } //进栈 void Push(SeqStack *S, DataType x) { if(IsFull(S)) { printf("栈上溢!"); exit(1); } S -> data[++ S -> top] = x; return; } //出栈 DataType Pop(SeqStack *S) { if(IsEmpty(S)) { printf("栈为空!"); return -1; } return S -> data[S -> top--]; //栈顶指针加1后将x入栈 } //取栈顶元素 DataType Top(SeqStack *S) { if(IsEmpty(S)) { printf("栈为空!"); exit(1); } return S -> data[S -> top]; } //括号匹配 void PrintMatchedPairs(char *expr) { SeqStack S; int i , j , length = strlen(expr); Initial(&S); for(i = 1 ; i <= length ; i++) { if(expr[i - 1] == '(') { Push(&S,i); } else if(expr[i - 1] == ')') { j = Pop(&S); if(j == -1) { printf("没有对应第%d个右括号的左括号\n", i); } else { printf("%d %d\n",i,j); } } } while(!IsEmpty(&S)) { j = Pop(&S); printf("没有对应第%d个左括号的右括号\n", j); } }
相关文章推荐
- 算法分析——括号匹配
- 算法分析: 最长有效括号的长度
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- 括号匹配算法
- 常见算法题:判断表达式括号是否匹配
- 顺序栈 & 顺序栈的括号匹配算法
- java括号匹配算法
- 验证括号匹配-算法
- 算法学习 - 括号匹配(栈实现)C++
- 算法——括号匹配问题(堆栈应用)
- java括号匹配算法
- 算法--括号匹配
- [zz]三种模式匹配算法(KMP,MonteCarlo,LasVegas)的比较与分析
- PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
- 对如下字符串(234453)[234]{2324}分析它的括号使用是否正确,括号匹配(Java实现)
- 算法学习——栈的应用之括号匹配
- 括号匹配算法
- 算法-括号匹配
- 关于栈的算法(以括号匹配为例)
- 自己写的括号匹配算法