声明
以下内容仅供学习,如有侵权,联系作者删除。
参考文献:王道考研系列数据结构、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语言)