算法:假设表达式中包含两种括号:圆括号、方括号和大扩号。检验括号是否匹配可以用堆栈来实现当遇到 ( 或 [或{ 时进栈,遇到 ] 或 ] 或}时出栈进行匹配检验,如果出现不匹配的情况立即结束,否则继续取下一个字符。如果没有遇到不匹配的情况,最后判断栈是否为空,栈为空,括号匹配,否则不匹配
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define NULL 0
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char SElemType;
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈容量
}SqStack;
Status InitStack(SqStack &S){
//构造空栈S
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW); //存储分配失败
S.top=S.base; //空栈
S.stacksize=STACKINCREMENT;
return(OK);
}//InitStack
Status Push(SqStack &S, SElemType e){
//插入e为栈顶元素
if(S.top-S.base==S.stacksize){//栈满则应重新分配空间
S.base=(SElemType *)
realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=(S.base+S.stacksize);//使得S.top重新指向栈顶,因realloc
S.stacksize+=STACK_INIT_SIZE;
}
*S.top++=e; //top指向待插入位置
return(OK);
}//Push
Status Pop(SqStack &S,SElemType &e){
//若栈不空则栈顶元素出栈并用e带回其值
if(S.top==S.base)return ERROR;
e=*(--S.top); //栈顶元素为*(S.top-1)
return OK;
}
Status StackEmpty(SqStack S){
if(S.top==S.base)return OK;
return ERROR;
}//StackEmpty
Status match(char *str ) {
SqStack S;
InitStack(S);
int i, count;
char e,c;
i=0;
count=0;
while(c=str[i++]&&count==0){
switch(c){
case '(':
case '[':
case '{':
Push(S,c);break;
case '}':
if(StackEmpty(S))
{count++;break;}
else{
Pop(S,e);
if(e!='{')
{count++;break;}}
case ']':
if(StackEmpty(S))
{count++;break;}
else{
Pop(S,e);
if(e!='[')
{count++;break;}}
case ')':
if(StackEmpty(S))
{count++;break;}
else{
Pop(S,e);
if(e!='(')
{count++;break;}}
default :break;
}//switch
if(count==0&&StackEmpty(S))
printf("The string is match!\n");
else printf("The string is not match!\n");
return OK;
}
}
void main() {
char str[100];
int count;
SqStack S;
InitStack(S);
printf ("Please input the string:");
scanf ("%s",str);
match(str);
}
分享到:
相关推荐
在本论文中,我们将讨论括号匹配的算法和实现方法,并提供一个使用C语言实现的可运行程序。 一、题目分析及设计思路 括号匹配的基本思想是使用栈来存储左括号,然后逐个出栈比较右括号的匹配是否正确。具体实现...
我们定义了一个结构体`sqstack`,它有三个成员变量:`base`、`top`和`stacksize`。其中,`base`是栈的底部指针,`top`是栈的顶部指针,`stacksize`是栈的大小。 我们还定义了四个函数:`Initstack`、`Push`、`Pop`...
括号匹配是计算机科学中一个基础且重要的概念,主要涉及到字符串处理、编译原理和算法设计。这个实验的目的是让你理解和实现一个简单的程序,能够检查输入的字符串中的括号是否按照正确的规则进行配对。括号通常包括...
括号匹配问题是计算机科学中的一个经典问题,涉及到数据结构和算法的应用。通过使用栈这种数据结构,我们可以有效地解决这个问题。本问题的设计思路清晰,逻辑严密,能够准确地检测表达式中括号的匹配性。
实验报告的主题是“数据结构C语言版栈的应用单括号匹配”,主要目的是通过实现一个程序来检测输入的字符串中的括号是否匹配。该程序利用栈这一数据结构来解决括号匹配问题,它允许括号的嵌套。实验内容包括定义栈的...
如果是右括号,与栈顶括号匹配,则出栈,消去一个括号;否则,得到“不匹配”结论,结束。如果栈空,得到“不匹配”结论,结束。 Step 3:若栈空,则表达式中括号匹配;否则,不匹配。 在实现时,可以使用 C++ ...
根据给定的文件信息,我们可以总结出以下关于“8586 括号匹配检验”的相关知识点: ### 一、程序概述 该程序的主要功能是进行括号匹配检验,即判断输入的一串字符中的括号(包括圆括号 `()` 和方括号 `[]`)是否成...
### 括号匹配 C++程序 #### 一、概览 本文将详细介绍一个用于检查字符串中的括号是否正确匹配的C++程序。该程序主要通过定义几个辅助函数来实现括号匹配的功能,并最终通过`check`函数完成整体逻辑。 #### 二、...
在这个项目中,我们专注于一个特定的任务——括号匹配,这是编译器在语法分析阶段的关键部分。本文将详细阐述如何使用C++编写一个简单的编译器,以实现对输入的语句或数学表达式进行括号匹配的检查。 一、编译器...
括号匹配是编程领域中一个基础且重要的概念,主要涉及到字符串处理、算法和数据结构——尤其是栈的应用。在处理表达式、代码解析或文本格式验证时,括号匹配是必不可少的工具。本主题将深入探讨如何验证括号的正确性...
假设一个算术表达式中包括圆括号、方括号和花括号三种形式的括号,判别表达式中括号是否正确配对。 ...1、左右括号匹配正确 2、左右括号配对次序不正确; 3、右括号多于左括号 4、左括号多于右括号
综上所述,这个项目是关于使用标准栈数据结构来实现括号匹配功能的,作者使用了C++语言,创建了一个能够处理{}、[]、()三种括号的匹配工具。具体实现可能包括读取输入字符串,遍历每个字符,遇到左括号时将其压...
在编程领域,括号匹配是一项基础且重要的任务,主要用于验证字符串中的括号是否按照正确的规则进行配对。这里我们关注的是使用顺序栈来解决这个问题。顺序栈是一种数据结构,它利用数组来存储元素,遵循后进先出...
以下将详细介绍这三个概念及其C++实现。 首先,我们来探讨**回文判断**。回文是指正读反读都能读通的字符串,如“上海自来水来自海上”或“12321”。在C++中,可以使用双指针法或者栈来判断一个字符串是否为回文。...
括号匹配问题是一个经典的计算机科学问题,常用于编译器设计、表达式求值等领域。本篇将基于提供的代码示例,深入探讨括号匹配算法的核心概念、实现原理及其应用场景。 #### 二、基础知识回顾 在正式介绍括号匹配...
括号匹配问题是一个经典的计算机科学问题,主要涉及数据结构中的栈这一概念。在这个问题中,我们需要检查一个字符串表达式中的括号(圆括号“()”、方括号“[]”和大括号“{}”)是否按照正确的规则配对。正确配对的...
在这个示例中,`isMatch`函数实现了括号匹配的逻辑,`main`函数负责获取用户输入并调用`isMatch`进行判断。注意,此示例仅处理了三种基本的括号类型,并假设输入字符串只包含括号。在实际应用中,可能需要处理更复杂...
假设一个算术表达式中可以包含三种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已...
在这个问题中,我们需要关注的重点是括号匹配,这是一个经典的算法问题,常见于编译原理和数据结构课程中。括号匹配通常用于检查数学或编程语言中的表达式是否有效,确保每个开启的括号都有对应的关闭括号。 在给定...