C语言实现顺序栈的括号匹配

转载 2015年07月08日 21:48:46
//顺序栈的使用举例:括号的匹配
#include <stdio.h>
#include <stdlib.h>


#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define BUFFERSIZE 256


typedef int Status; //函数返回状态
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)//分配失败
    {
        printf("分配内存失败.\n");
        exit(0);
    }
    S->top=S->base;
    S->stacksize=STACK_INIT_SIZE;
    return OK;
}


Status DestroyStack(SqStack *S){
    //销毁栈S,S不再存在
    if(!S)//S为空
    {
        printf("指针为空,释放失败.\n");
        exit(0);
    }
    free(S);
    return OK;
}


Status ClearStack(SqStack *S){
    //把栈S置为空栈
    if(!S)//S不存在
        return FALSE;
    S->top=S->base;//直接将栈顶指针指向栈底
    return OK;
}


Status StackEmpty(SqStack S){
    //若栈S为空栈,则返回TRUE,否则返回FALSE
    if(S.top==S.base)
        return TRUE;
    else
        return FALSE;
}


int StackLength(SqStack S){
    //返回S元素的个数,即栈的长度
    return S.stacksize;
}


Status GetTop(SqStack S,SElemType *e){
    //若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回FALSE
    if(S.top==S.base){
        //printf("栈为空.\n");
        return FALSE;
    }else{
        *e=*(S.top-1);
        //printf("%c",*e);
        return OK;
    }
}


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)
        {
            printf("重新申请空间失败.\n");
            exit(0);
        }
        S->top=S->base+S->stacksize;//更改栈顶指针
        S->stacksize+=STACKINCREMENT;
    }
    *S->top++=e;
    return OK;
}


Status Pop(SqStack *S,SElemType *e){
    //若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
    if(S->top==S->base){//栈为空
        printf("栈为空.\n");
        return ERROR;
    }
    *e=*(--S->top);
    return OK;
}


Status StackTraverse(const SqStack *S){
    //从栈底到栈顶依次对每个元素进行访问
    SElemType *p=S->base;
    if(S->base==S->top)
    {
        printf("栈为空.\n");
        return FALSE;
    }
    //printf("栈中元素:");
    while(p!=S->top)
    {
        printf("%c",*p++);
    }
    printf("\n");
    return OK;
}


Status BracketMatch(SqStack *S,const char *string){
    //输入字符串string中的括号匹配,返回TRUE;否则返回FALSE
    const char *p=string;
    SElemType e;
    InitStack(S);
    while(*p!='\0'){//遍历字符串
        switch(*p){//判断p的值
            case '('://左括号,入栈
            case '[':
            case '{':
                Push(S,*p);
                //printf("Push %c",*p);
                break;
            case ')':
                if(FALSE==GetTop(*S,&e))
                    return FALSE;
                if(e=='('){
                    if(ERROR==Pop(S,&e))
                        return FALSE;
                    //printf("Push %c",*p);
                }else
                    return FALSE;
                break;
            case ']':
                if(FALSE==GetTop(*S,&e))
                    return FALSE;
                if(e=='['){
                    if(ERROR==Pop(S,&e))
                        return FALSE;
                    //printf("Push %c",*p);
                }else
                    return FALSE;
                break;
            case '}':
                if(FALSE==GetTop(*S,&e))
                    return FALSE;
                if(e=='{'){
                    if(ERROR==Pop(S,&e))
                        return FALSE;
                    //printf("Push %c",*p);
                }else
                    return FALSE;
                break;
            default:
                ;
        }//switch
        p++;
    }//while
    if(!StackEmpty(*S))//字符串遍历完,栈非空,不匹配
        return FALSE;
    return TRUE;
}


int main()
{
    char *string;
    SqStack stack;
    string=(char*)malloc(sizeof(char)*BUFFERSIZE);
    if(!string){
        printf("分配内存失败.\n");
        exit(0);
    }
    while(1){
        printf("请输入一行含括号的表达式(输入\"!\"退出):");
        gets(string);
        if(string[0]=='!')//退出
            break;
        if(TRUE==BracketMatch(&stack,string)){
            printf("\n能  正确匹配.\n\n");
        }else{
            printf("\n不能 正确匹配.\n\n");
        }
    }//while
    return 0;

}


运行结果:


利用栈实现括号匹配算法!

#include #include //malloc,realloc #include //含有overflow #include //exit() #define S_SIZE...

顺序栈实现括号匹配

//采用顺序栈编程实现:表达式的括号是否匹配问题。 //要求:输入带括号的表达式,判断其中括号是否配对。 //扩展功能:给出配对括号的位序和不配对括号的位序。#include #include #...

c语言栈实现括号匹配

在文字处理软件或编译程序设计时,常常需要检查一个字符串或一个表达式中的括号是否相匹配? 匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描...

数据结构之---C语言实现括号匹配(栈实现)

数据结构之---C语言实现括号匹配(栈实现)

栈的应用——括号匹配的检验(C语言)

这个应用来自于严蔚敏的《数据结构(C语言版)》,即这本书上的第49页。大致要实现的功能如下: 假设表达式中允许包括两种括号:圆括号和方括号,其嵌套的顺序随意,即(【】())或【(【】【】)】等为正确...
  • cghver
  • cghver
  • 2012年04月17日 19:31
  • 13159

利用顺序栈实现多项式的括号匹配

1.括号匹配函数如下: 2.下面是主函数: 3.源文件与头文件的关系: 4.调用的pop(出栈)函数与push(进栈)函数: void SeqStack::Push(const int& x...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

顺序栈的括号匹配算法

#include const int Stack_Size = 30; const int TRUE = 1; const int FALSE = 0; typedef struct //...
  • zpluw
  • zpluw
  • 2012年07月24日 23:21
  • 963

数据结构作业 栈 实现 括号匹配 问题

数据结构作业 栈 实现 括号匹配 问题

利用栈实现括号匹配算法!

算法:检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。 #include #include //ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言实现顺序栈的括号匹配
举报原因:
原因补充:

(最多只允许输入30个字)