括号匹配的检验 数据结构【C语言】

  《数据结构 (C语言版)》严蔚敏 案例
  原问题:假设表达式中允许包括两种括号:圆括号和方括号,其嵌套方式随意,即(【】())等都是正确的格式,【(】)是不正确的格式。设计一个算法检查输入的字符串中的括号是否是匹配的。

#include
#include
#include

#define STACK_INIT_SIZE 10 // 初始化分配量
#define STACKINCREMENT 1  // 分配增量
#define ERROR 0
#define OK 1

typedef int Status;
typedef char SElemType;

typedef struct{
	SElemType *base;  // 栈底指针
    SElemType *top;   // 栈顶元素
    int stacksize;    //栈的大小 
}SqStack;

//初始化
Status InitStack(SqStack &S){
	S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base) 
	return ERROR;
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
} 

//判断是否是空栈
Status StackEmpty(SqStack &S){
	if(S.top==S.base) return OK;
	else return ERROR;
}

Status StackLength(SqStack &S)
{   // 获取栈容量
    return S.top - S.base;
}

// 入栈 
Status Push(SqStack &S, SElemType *e)
{
    if(S.top - S.base == S.stacksize)
    {
        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S.base) return ERROR;
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++= *e;
    return OK;
}

//出栈
 Status Pop(SqStack &S, SElemType *e)
{ 
    if(S.top == S.base) return ERROR;
    *e = *--S.top;
    return OK;
}


// 获取栈顶元素
Status GetTop(SqStack &S,SElemType *e){
//	如果不是空栈,用e返回S的栈顶元素,并返回OK,否则返回ERROR
   if(S.top==S.base) return ERROR;
   *e=*(S.top-1);
   return OK;
} 

//符号匹配的检验
Status Matching(SqStack &S){
	SElemType e,out;
	printf("请依次输入符号(输入#结束):\n");
 while(e != '#')    // 如果匹配不通过,必须手动输入 # 来结束程序,可输出当前剩余元素,若匹配,则不输出 
    {
        scanf("%c", &e);
        getchar();
        if(e == '#') break;       // 不写这行会出现输入一个 # 不会退出
        if(StackLength(S) >= 0)     
        {
            int i = 0;
            GetTop(S, &out);       // 获取当前栈顶元素
            Push(S, &e);            // 入栈
            if(abs(out-e) == 1 || abs(out-e) == 2)  // 如果括号匹配通过
            {
                while(i != 2)         // 要出栈两次,因为新的元素已经插入,此时栈顶两个元素是匹配成功的,删除的是这两个元素
                {
                    Pop(S, &out);         
                    i ++;
                }
                if(StackEmpty(S))    // 顺序栈为空,跳出循环,提示通过
                {
                    printf("\n符号匹配!\n");
                    break;
                }
                continue;
            }
        }
    }
    {   // 出栈,查看当前剩余元素
        printf("\n栈的元素为:\n");
        while(S.top != S.base)
        {
            Pop(S, &e);
            printf("%c ", e);
        }
    }
    return OK;
}

int main(){
	SqStack S;
    
//    判断是否初始化成功是不能删除的,删除后程序运行异常 
	if(InitStack(S)) printf("\n初始化成功!\n");
    else exit(0);
    
    Matching(S);
    return OK;
} 

  • 符号匹配,运行结果如下:
    括号匹配的检验 数据结构【C语言】_第1张图片
  • 如果符号不匹配,需要手动输入#,会显示不匹配的栈的元素

括号匹配的检验 数据结构【C语言】_第2张图片

参考资料:括号检验

你可能感兴趣的:(数据结构,c语言)