| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 909 人关注过本帖
标题:用栈实现括号配对!!
只看楼主 加入收藏
huangshengql
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-3-20
结帖率:71.43%
收藏
已结贴  问题点数:10 回复次数:5 
用栈实现括号配对!!
#include<stdio.h>
#include<stdlib.h>
#include<Stack>
int MatchPairs(char *expr)
{
    Stack s;
    char ch;
    int i,j;
    InitStack(&s);
    for(i=0;i<100;i++)
    {
        ch=expr[i];
        switch(ch)
        {
        case '(':
        case '[':Push (&s,ch);break;
        case ')':
            GetTop(s,&ch);
            if(ch=='(')
            {
                j=Pop(&s);
                if(j==0) return 0;
            }
            else return 0;
            break;
        case ']':
            GetTop(s,&ch);
            if(ch=='[')
            {
                j=Pop(&s);
                if(j==0) return 0;
            }
            else return 0;
            break;
        }
    }
    if(!StackEmpty(s))
        return 0;
    return 1;
}
void main()
{
    char expr[80];
    int flag;
    printf("input expression\n");
    gets(expr);
    flag=MatchPairs(expr);
    if (flag) printf("Matched.\n");
    else printf("Not Matched.\n");
}
编译结果:1>e:\vc6.0实验\括号配对\括号配对\源.cpp(6): error C2065: “Stack”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(6): error C2146: 语法错误: 缺少“;”(在标识符“s”的前面)
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(6): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(9): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(9): error C3861: “InitStack”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(16): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(16): error C3861: “Push”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(18): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(18): error C3861: “GetTop”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(21): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(21): error C3861: “Pop”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(27): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(27): error C3861: “GetTop”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(30): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(30): error C3861: “Pop”: 找不到标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(37): error C2065: “s”: 未声明的标识符
1>e:\vc6.0实验\括号配对\括号配对\源.cpp(37): error C3861: “StackEmpty”: 找不到标识符
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
搜索更多相关主题的帖子: 配对 include return 
2013-05-06 20:21
小小玉
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:47
专家分:156
注 册:2013-4-13
收藏
得分:10 
首先你的栈需要声明,InitStack(&s);Push (&s,ch);GetTop(s,&ch);Pop(&s);StackEmpty(s)这些对栈就行操作的函数你没有编写,你没法进行调用。
例如:struct stack{
int cnt;/*用来统计栈里面的元素个数*、
elem *top;/*指向栈顶元素*/
};
viod InitStack(stack *stk)
{stk->cnt=0;
stk->top=NULL;
}
2013-05-06 20:47
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
#include<Stack>
头文件不加.h的方式, 应该是C++的方式吧?
用C++的话,别忘了引用命名空间

看你这个应该是C的方式,因为都是函数,可以试着修改下这个引用头文件的方式,加上.h

为游戏狂~~!!    大家努力编哈!
2013-05-07 22:49
Emily_CYY
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2013-4-1
收藏
得分:0 
。。。。我之前写过~~要不看看(新手来的。。。不过运行过了的)
程序代码:
#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE  1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef char SElemType;
typedef int Status;

typedef struct{
  SElemType *top,*base;
  int stacksize;

}SqStack;
/*构建一个空栈*/
Status InitStack(SqStack *S){

    S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S->base) return OVERFLOW;
    S->top=S->base;
    S->stacksize=STACK_INIT_SIZE;
    return OK;
}
/*判断栈满*/
Status StackFull(SqStack *S){
     return S->top-S->base>=S->stacksize;

}

/*进栈*/
Status Push(SqStack *S,SElemType e){
     
   if(StackFull(S)) return OVERFLOW;
   *(S->top++)=e;
   return OK; 

}
/*出栈*/
SElemType Pop(SqStack *S){
     
    if(S->base==S->top) return ERROR;
    return *(--S->top);
}

/*求栈的长度*/
Status StackLength(SqStack *S){

 return (S->top)-(S->base);
}

void main()
{
    int x,y,i=0,j=0,k=0,m=0; //k表示是if园做了,m表示是if方做了,为1做了,反之
    char c;
    SElemType e,f;
    SqStack stack1,stack2;
    SqStack *S1,*S2;
    S1=&stack1;
    S2=&stack2;
    
    InitStack(S1);
    InitStack(S2);
    
    printf("请输入字符串:\n");

    
    while ((c=getchar())!='\n'){
    
        if(c=='('||c==')'){
        
            if(c=='(')  Push(S1,c);
            else {//i表示多出的右圆括号的个数
                e=Pop(S1);
                if (e==ERROR) ++i;
            }
            k=1;
        }

        if (c=='['||c==']'){
        
            if(c=='[')  Push(S2,c);
            else {
                f=Pop(S2);
                if (f==ERROR) ++j;
            }
        m=1;
        }    
    }
    
     x=StackLength(S1);
     y=StackLength(S2);
    if(x==0 && y==0 && i==0 && j==0)
        printf("所有括号完全匹配\n");
    if(x==0 && i==0 && k==1 && m==1){
    
        if(y==0 && j>0)  printf("圆括号完全匹配,还差%d左方括号\n",j);
        if(y>0 && j==0)  printf("圆括号完全匹配,还差%d右方括号\n",y);
    }

        if(y==0 && j==0  && k==1 && m==1){
    
        if(x==0 && i>0)  printf("方括号完全匹配,还差%d左圆括号\n",i);
        if(x>0 && i==0)  printf("方括号完全匹配,还差%d右圆括号\n",x);
    }
        
        if(y==0 && j>0 && k==0)  printf("还差%d左方括号\n",j);
        if(y>0 && j==0 && k==0)  printf("还差%d右方括号\n",y);

        if(x==0 && i>0 && m==0)  printf("还差%d左圆括号\n",i);
        if(x>0 && i==0 && m==0)  printf("还差%d右圆括号\n",x);


}
2013-05-08 12:22
Emily_CYY
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2013-4-1
收藏
得分:0 
回复 4楼 Emily_CYY
自我感觉有点复杂样。。求指导改进~~
2013-05-08 12:23
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
int Bracketscheck()
{
    char a[81];       //定义字符数组a保存从键盘输入的字符串
    char s[10];        //定义字符数组s作为保存未分配对的括号
    int top=-1;
    cout<<"请输入一个字符串:";
        cin.getline(a,81);
    int i=0;
    while(a[i])
    {
        char ch=a[i++];
        switch(ch)
        {
        case '{':
        case '[':
        case '(':
            top++;s[top]=ch;
            break;
        case '}':
            if(top>=0&&s[top]=='{')top--;
            else return false;
            break;
        case ']':
            if(top>=0&&a[top]=='[')top--;
            else return false;
            break;
        case ')':
            if(top>=0&&s[top]=='(')top--;
            else return false;
        }
    }
    if(top==-1)return true;
    else return false;
}

Maybe
2013-05-08 20:22
快速回复:用栈实现括号配对!!
数据加载中...
 
   



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

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