注册 登录
编程论坛 数据结构与算法

关于括号的问题

yang158 发布于 2019-12-23 18:09, 2125 次点击
调用栈的基本操作函数实现下列操作:假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数correct(char *exp,int max),其中传入参数为表达式和表达式长度

#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
typedef char DataType;
typedef struct
{
    DataType stack[MaxStackSize];
    int top;
}SeqStack;

void StackInitiate(SeqStack *S)   //初始化顺序堆栈S
{
    S->top=0;                 //定义初始栈顶下标值
}

int StackNotEmpty(SeqStack S)    //判顺序堆栈S非空否,非空返回1,否则返回0
{
    if(S.top<=0)
    return 0;
    else
    return 1;
}

bool Push(SeqStack *S,DataType x)     //把数据元素值x压入顺序堆栈S,入栈成功返回1,否则返回0
{
    if(S->top>=MaxStackSize)
    {
        printf("堆栈已满无法插入!\n");
        return 0;
    }
    else
    {
        S->stack[S->top]=x;
        S->top++;
        return 1;
    }
}

bool Pop(SeqStack *S,DataType *d)       //弹出顺序堆栈S的栈顶元素值到参数d,出栈成功返回1,否则返回0
{
    if(S->top<=0)
    {
        printf("堆栈已空无数据元素出栈!\n");
        return 0;
    }
    else
    {
        S->top--;
        *d=S->stack[S->top];
        return 1;
    }
}

bool Top(SeqStack S,DataType *d)      //取顺序堆栈S的当前栈顶数据元素值到参数d,成功返回1,否则返回0
{
    if(S.top<=0)
    {
        printf("堆栈已空!\n");
        return 0;
    }
    else
    {
        *d=S.stack[S.top-1];
        return 1;
    }
}

void correct(char exp[],int n)      //判断有n个字符的字符串exp左右括号是否配对成功
{
    SeqStack NEWStack;               //定义顺序堆栈变量NEWStack
    int i;
    char c;
    StackInitiate(&NEWStack);
    for (i=0;i<n,i++;)
{
    if((exp[i]=='(')||(exp[i]=='[')||(exp[i]=='{'))
    Push(&NEWStack,exp[i]);                    //入栈
    else if (exp[i]==')'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c=='(')
    Pop(&NEWStack,&c);                    /出栈
    else if (exp[i]==')'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c!='(')        
{
    printf("左右括号配对次序不正确!\n");
    return;
}                                  //判断括号
    else if (exp[i]==']'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c=='[')
    Pop(&NEWStack,&c);
    else if (exp[i]==']'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c!='[')
{
    printf("左右括号配对次序不正确!\n");
    return;
}                         //判断方括号
    else if (exp[i]=='}'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c=='{')
    Pop(&NEWStack,&c);
    else if (exp[i]=='}'&&StackNotEmpty(NEWStack)
    &&Top(NEWStack,&c)&&c!='{')
{
    printf("左右括号配对次序不正确!\n");
    return;
}                      //判断花括号
    else if(((exp[i]==')')||(exp[i]==')')||(exp[i]=='}'))
    &&!StackNotEmpty(NEWStack))
{
    printf("左括号多于右括号!\n");
    return;
}
}
    if(StackNotEmpty(NEWStack))
    printf("左括号多于右括号!\n");
    else
    printf("左右括号匹配正确!\n");
}

int main(void)
{
    char a[]="(())abc{[]()}";          //测试例子1
    char b[]="(()))abc{[]}";          //测试例子2
    char c[]="(()()abc{[]}";          //测试例子3
    char d[]="(())abc{[]}";          //测试例子4
   
    int n1=strlen(a);
    int n2=strlen(b);
    int n3=strlen(c);
    int n4=strlen(d);
   
    correct(a,n1);
    correct(b,n2);
    correct(c,n3);
    correct(d,n4);
}
这个代码找不出哪里出了问题,结果运行出来都是一样的
只有本站会员才能查看附件,请 登录
0 回复
1