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

声明

以下内容仅供学习,如有侵权,联系作者删除。
参考文献:王道考研系列数据结构、B站up主:C语言技术网
链接: C语言技术网

栈在括号匹配中的应用

1.代码

代码修改于seqstack1.c,添加括号匹配函数。
//xxxx:代表修改的地方。
seqstack1.c文件见文章底部链接,复制后,就可以跑起来。

/*
 * 程序名:seqstack2.c,此程序演示用顺序栈检查括号是否匹配,支持()[]{}三种括号。
 * 作者:jack 日期:20210618
 * 参考作者:C语言技术网(www.freecplus.net), B站UP主:C语言技术网
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100       // 顺序栈的最大长度。		// xxxx

typedef char ElemType;   // 自定义顺序栈的数据元素为整数。		// xxxx

typedef struct
{
	ElemType data[MAXSIZE];  // 用数组存储顺序栈中的元素。
	int top;                 // 栈顶指针,从0到MAXSIZE-1,-1表示空栈。
							 // 也可以从1到MAXSIZE,0表示空栈。
}Seqstack, *PSeqStack;

// 顺序栈SS的初始化操作。
void InitStack(PSeqStack SS);

// 清空顺序栈。
void ClearStack(PSeqStack SS);

// 求顺序栈的长度,返回值:栈SS中元素的个数。
int Length(PSeqStack SS);

// 判断顺序栈是否已满,返回值:1-已满,0-未满或失败。
int IsFull(PSeqStack SS);

// 判断顺序栈是否为空,返回值:1-空,0-非空或失败。
int IsEmpty(PSeqStack SS);

// 元素入栈,返回值:0-失败;1-成功。
int Push(PSeqStack SS, ElemType *ee);

// 元素出栈,返回值:0-失败;1-成功。
int Pop(PSeqStack SS, ElemType *ee);

// 获取栈顶元素,返回值:0-失败;1-成功。
// 只查看栈顶元素的值,元素不出栈。
int GetTop(PSeqStack SS, ElemType *ee);

// 打印顺序栈中全部的元素。
void PrintStack(PSeqStack SS);

// 销毁顺序栈SS。
void DestroyStack(PSeqStack SS);

// 检查表达式括号是否匹配,返回值:0-不匹配,1-匹配。
int checkbrackets(char *str);		// xxxx

int main()
{
	char str[101];  
	memset(str,0,sizeof(str));

	printf("请输入待检查的字符串:");
	fgets(str,100,stdin);    // 不建议用gets函数,gets函数编译时可能会出现警号。
	str[strlen(str)-1]=0;    // 删除str最后的换行。
	printf("输入的字符串是=%s=\n",str);

	if (checkbrackets(str) == 0) { printf("匹配失败。\n"); return -1; }

	printf("匹配成功。\n");

	return 0;
}

// 检查表达式括号是否匹配,返回值:0-不匹配,1-匹配。
int checkbrackets(char *str)		// xxxx
{
	Seqstack S;		// 创建顺序栈。
	InitStack(&S);	    // 初始化顺序栈。

	ElemType e;        // 创建一个数据元素。

	int ipos, len = strlen(str);
	for(ipos=0; ipos<len; ipos++)
	{
		// 如果是左括号,入栈。
		if ( (str[ipos]=='(') || (str[ipos]=='[') || (str[ipos]=='{') )  Push(&S, &str[ipos]);

		//if ( (str[ipos]=='(') || (str[ipos]=='[') || (str[ipos]=='{') )  Push(&S, str+ipos);  // 用指针运算也可以

		// 如果是右括号,出栈,并判断是否匹配。
		if ( (str[ipos]==')') || (str[ipos]==']') || (str[ipos]=='}') ) 
		{
			// 一定要判断出栈结果,如果栈中没有元素,匹配失败。
			if (Pop(&S,&e) != 1) return 0; 

			// 只要出现了不匹配的情况,函数返回。
			if ( (str[ipos]==')') && (e!='(') ) return 0; 
			if ( (str[ipos]==']') && (e!='[') ) return 0; 
			if ( (str[ipos]=='}') && (e!='{') ) return 0; 
		}
	}

	// 如果全部的括号都匹配,栈一定是空的。
	return IsEmpty(&S);
}

// 顺序栈SS的初始化操作。
void InitStack(PSeqStack SS)
{
	ClearStack(SS); // 清空顺序栈。
}

// 清空顺序栈。
void ClearStack(PSeqStack SS)
{
	if (SS == NULL) return; // 检查空指针。
	SS->top = -1;  // 栈顶指针置为-1。
	memset(SS->data, 0, sizeof(ElemType)*MAXSIZE);
}

// 求顺序栈的长度,返回值:栈SS中元素的个数。
int Length(PSeqStack SS)
{
	if (SS == NULL) return 0; // 检查空指针。
	return SS->top + 1;
}

// 判断顺序栈是否已满,返回值:1-已满,0-未满或失败。
int IsFull(PSeqStack SS)
{
	if (SS == NULL) return 0;  // 检查空指针。

	if (SS->top >= MAXSIZE - 1) return 1;

	return 0;
}

// 判断顺序栈是否为空,返回值:1-空,0-非空或失败。
int IsEmpty(PSeqStack SS)
{
	if (SS == NULL) return 0;  // 检查空指针。

	if (SS->top == -1) return 1;
	return 0;
}

// 元素入栈,返回值:0-失败;1-成功。
int Push(PSeqStack SS, ElemType *ee)
{
	if ((SS == NULL) || (ee == NULL)) return 0;  // 检查空指针。

	if (IsFull(SS) == 1)
	{
		printf("顺序栈已满,不能插入。\n"); return 0;
	}

	SS->top++;  // 栈指针先加1。
	memcpy(&SS->data[SS->top], ee, sizeof(ElemType));  // 用数组的下标访问。
	return 1;
}

// 元素出栈,返回值:0-失败;1-成功。
int Pop(PSeqStack SS, ElemType *ee)
{
	if ((SS == NULL) || (ee == NULL)) return 0;  // 检查空指针。

	if (IsEmpty(SS) == 1) { printf("栈为空。\n"); return 0; }

	memcpy(ee, SS->data + SS->top, sizeof(ElemType));  // 采用指针运算也可以。
	SS->top--;  // 栈指针1。

	return 1;
}

// 获取栈顶元素,返回值:0-失败;1-成功。
// 只查看栈顶元素的值,元素不出栈。
int GetTop(PSeqStack SS, ElemType *ee)
{
	if ((SS == NULL) || (ee == NULL)) return 0;  // 检查空指针。

	if (IsEmpty(SS) == 1) { printf("栈为空。\n"); return 0; }

	memcpy(ee, SS->data + SS->top, sizeof(ElemType));  // 采用指针运算也可以。

	return 1;
}

// 打印顺序栈中全部的元素。
void PrintStack(PSeqStack SS)
{
	if (SS == NULL) return;  // 检查空指针。

	if (SS->top == -1) { printf("栈为空。\n"); return; }

	int kk;
	for (kk = 0; kk <= SS->top; kk++)
	{
		printf("SS[%d],value=%d\n", kk, SS->data[kk]);     // 用数组的下标访问。
		// printf("SS[%d],value=%d\n",kk,*(SS->data+kk));   // 采用指针运算也可以。
	}
}

// 销毁顺序栈SS。
void DestroyStack(PSeqStack SS)
{
	// 静态顺序栈无需释放内存,不需要销毁操作。

	ClearStack(SS); // 清空顺序栈。

	return;
}


2.运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

小伙伴们可以自行测试其他结果。

seqstack1.c见链接: 栈的实现(C语言)

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值