鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 括号匹配(栈的应用)

  [复制链接]
发表于 2015-1-27 20:16:05 | 显示全部楼层
原来python的逆波兰的思路在这个地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-28 16:34:42 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 20
#define STACKINCREAMENT 10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;

void initStack( sqStack *s )
{
    s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s->base )
    {
        exit(0);
    }
    s->top = s->base;
    s->stackSize = STACK_INIT_SIZE;
}

void Push( sqStack *s, ElemType *e )
{
    if( s->top - s->base >= s->stackSize )
    {
        s->base = (ElemType*)realloc( s->base, ( s->stackSize + STACKINCREAMENT ) * sizeof(ElemType) );
        if( !s->base )
        {
            exit(0);
        }
    }
    *(s->top) = e;
    s->top++;
}

void Pop( sqStack *s, ElemType *e )
{
    if(s->top == s->base)
        return;
    *e = * --(s->top);
}

int StackLen(sqStack s)
{
    return (s.top - s.base);
}

int main()
{
    sqStack s;
    char c;
    int e;

    initStack( &s );

    printf("请输入需要验证的括号,以#结束:\n");
    scanf("%c", &c);

    while(c != '#')
    {
        if( c!='(' && c!=')' && c!='[' && c!=']' && c!='{' && c!='}' && c!='<' && c!='>')
            {
                printf("输入的字符不为括号!\n");
                return -1;
            }
        if( c == s.base )
        {
            Push(&s, e);
            break;
        }
        Pop( &s, c );
    }

    if( s.top == s.base )
    {
        printf("\n输入的括号匹配成功!\n");
    }
    else
    {
        printf("\n输入的括号不匹配!\n");
    }

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-28 16:51:29 | 显示全部楼层
楼上我写的代码是错的。修改了下调试成功了。
基本跟小甲鱼老师一样,不过在主函数里,写法稍有不同。下面是主函数源代码:
int main()
{
    sqStack s;
    char c;
    int e;

    initStack( &s );

    printf("请输入需要验证的括号,以#结束:\n");
    scanf("%c", &c);

    while(c != '#')
    {
       // 如果是括号,就压栈
        if( c=='(' || c==')' || c=='[' || c==']' || c=='<' || c=='>' || c=='\'' || c=='\"' || c=='{' || c=='}' )
        {
            if( !StackLen(s) )
            {
                Push(&s, c);
            }
            else
            {

                if( match(s.top, c) )
                {
                    Pop( &s, e);
                }
                else
                {
                    Push( &s, c);
                }
            }
        }

        scanf("%c", &c);    // 输入下一个字符
    }

    if( !StackLen(s) )
    {
        printf("\n输入的括号匹配成功!\n");
    }
    else
    {
        printf("\n输入的括号不匹配!\n");
    }

}

具体来说,每次先判定s.top和c是否匹配,如果匹配,则栈底出栈;如果不匹配,则将c入账。最后判定栈里无字符,则全部匹配成功。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-1 10:41:01 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-15 14:03:17 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-2 21:49:50 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-8 15:45:27 | 显示全部楼层
VIP都要回复啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-13 15:18:47 | 显示全部楼层
比较一下啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-14 13:49:18 | 显示全部楼层

#include"iostream"
using namespace std;

typedef struct {
        int top;
        char a[100];
}stack;

void push(stack s, char a)
{
        if (s.top == 99)
                return;
        else
                s.a[++s.top] = a;
}

char pop(stack s)
{
        if (s.top == -1)
                return 0;
        else
                return s.a[--s.top];
}

int main()
{
        stack s;
        s.top = -1;
        char k;
        char n;
        int flag = 1;

        cin >> k;
        while (k != '#')
        {
                cin >> k;
                if (k == '(' || k == '{' || k == '[')
                        push(s, k);
                if (k == ')')
                {
                        n = pop(s);
                        if (n != '(')
                                flag = 0;
                }
                if (k == '}')
                {
                        n = pop(s);
                        if (n != '{')
                                flag = 0;
                }
                if (k == ']')
                {
                        n = pop(s);
                        if (n != '[')
                                flag = 0;
                }
        }

        if (flag == 1)
                printf("输入字符串的括号完全匹配\n");
        else
                printf("输入字符串的括号不完全匹配\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-25 09:42:26 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-27 09:57:46 From FishC Mobile | 显示全部楼层
1111111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-31 19:26:38 | 显示全部楼层
我能说小甲鱼帮了我一个大忙吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-31 21:42:59 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-11 12:22:51 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-11 23:48:25 | 显示全部楼层
丢个5鱼币顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 23:03:32 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-22 16:56:56 | 显示全部楼层
好好学习了 强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-6 13:42:11 | 显示全部楼层
感谢小甲鱼强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-10 19:23:44 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-14 10:56:15 | 显示全部楼层
感兴趣,看看。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表