栈的应用之括号匹配的检验

栈的实际应用很多,其中括号匹配是很常见的例子。下面列出基本算法和源代码,标明注释以便日后复习和翻阅。

Description:

利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的

顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上

述括号的表达式,检验括号是否配对。本题给出部分check()函数,要求将check()函数补充完整,并完成

整个程序。

算法:

代码:

 1 void check()
 2  { // 对于输入的任意一个字符串,检验括号是否配对
 3    SqStack s;
 4    SElemType ch[80],*p,e;
 5    if(InitStack(s)) // 初始化栈成功
 6    {
 7      scanf("%s",ch);
 8      p=ch;
 9      while(*p) // 没到串尾
10        switch(*p)
11   {
12      case ‘(‘:
13      case ‘[‘:Push(s,*p);
14                 p++;
15                   break; // 左括号入栈,且p++,读下一个字符
16      case ‘)‘:
17      case ‘]‘:if(!StackEmpty(s)) // 栈不空,如果为空的话返回0;!0=1
18                   {
19                    Pop(s,e); // 弹出栈顶元素
20                     if(*p==‘)‘&&e!=‘(‘||*p==‘]‘&&e!=‘[‘)
21                                                 // 弹出的栈顶元素与*p不配对
22 {
23                       printf("isn‘t matched pairs\n");
24                       exit(ERROR);
25                     }
26                     else
27                     {
28                       p++;//读取下一个字符
29                       break; // 跳出switch语句
30                     }
31                   }
32                   else // 栈空
33                   {
34                     printf("lack of left parenthesis\n");
35                     exit(ERROR);
36                   }
37          default: p++; // 其它字符不处理,指针向后移
38        }
39      if(StackEmpty(s)) // 字符串结束时栈空
40        printf("matching\n");
41      else
42        printf("lack of right parenthesis\n");
43    }
44  }
时间: 2024-10-24 08:24:37

栈的应用之括号匹配的检验的相关文章

栈应用——最长括号匹配

问题描述: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长的括号字串,并返回字串的长度. 如: ((): 2 ()(): 4 ()(()):6 (()()): 6 思路分析: 记起始位置start = -1,最大匹配长度为max 考虑当前位置i的符号: 如果是'(',直接入栈: 如果是')': 如果栈空,则起始位置更新为i; 如果栈不空,则肯定能与栈顶的左括号匹配,然后考虑弹出一个左括号后的栈: 若栈空,则说明此次是一个匹配,匹配长度为:i-start,然

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi

括号匹配的检验

#include<iostream> #include<string.h> #include<stack> using namespace std; //判断括号是否能匹配,如果最后栈为空,则括号匹配,否则括号不匹配: int main(){ char ch; stack<char> s; int n; cin>>n; while(n--){ cin>>ch; if(s.empty()||ch=='['||ch=='('){ s.pu

顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)

#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKLINCREMENT 10

栈的应用之括号匹配

思路: 在算法中设置一个栈,每读入一个空号 一:若是右括号: '}'  ' )'   ']'(两种情况): 1:使置于栈顶的最急迫的期待得以消解,需将栈顶元素出栈: 2:不合法的情况,即与栈顶的最急迫的期待不匹配,需将其(括号)压栈: 二:若是左括号:'('  '{'  '[' 作为一个新的更急迫的期待压栈: 顺序栈的代码不再赘述:点击打开链接 //括号匹配 #include"stack.h" int main() { Stack st; InitStack(&st); int

数据结构(C语言) 栈的应用之括号匹配

#include<stdio.h> #include<stdlib.h> typedef struct SqStack { char str[100]; int top; }SqStack; void Push(SqStack* S, char c) { S->top++; S->str[S->top] = c; } void Pop(SqStack* S, char* c) { *c = S->str[S->top]; S->top--; }

数据结构 栈的应用——括号匹配的检验

1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 100 //存储空间初始分配量 7 #define STACKINCREMENT 10 //存储空间分配增量 8 #define SElemType char //当前数据类型 9 10 typedef struct 11 { 12 S

数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先检测栈是否为空, 若栈空则表明此右括弧多余,表达式不匹配. 否则和栈顶数据比较,若匹配则栈顶出栈. 否则表明表达式不匹配: 最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配. 实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作

Java中栈的应用,括号匹配

1 package edu.yuliang.Data_Structure_Basics; 2 3 import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; 4 /* 5 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 6 7 有效字符串需满足: 8 9 左括号必须用相同类型的右括号闭合. 10 左括号必须以正确的顺序闭合. 11 注意空字符串可被认为是有效字符串. 12 13 14 实现思路: 15