| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2061 人关注过本帖
标题:关于括号的问题
只看楼主 加入收藏
yang158
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-3-12
结帖率:16.67%
收藏
 问题点数:0 回复次数:0 
关于括号的问题
调用栈的基本操作函数实现下列操作:假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数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);
}
这个代码找不出哪里出了问题,结果运行出来都是一样的
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: exp return 括号 top int 
2019-12-23 18:09
快速回复:关于括号的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064741 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved