刮号判断

/****************************************************************
--程序描述:		输入不同刮号,判断是否匹配
--修改原因:		从前代码写不够规范
--修改日期:    	2009.5.29
--修改人:		吴强
--编辑工具and语言   	Turbo C for Windows , C语言
--输入要求:		只可输入 {, [, (, ), ], } 6种符号,并以空格表示结束
***********************************************************************/

#include 
#include 
#include 

typedef struct node
{
    char date;
    struct node	*next;
}Node;

Node *Push(Node *s, char c)
{
    Node *r;

    if (s == NULL)
    {
	r= (Node *)malloc( sizeof(Node) );
	r->date= c;
	r->next= NULL;
	s= r;

	return s;
    }
    else
    {
	r=(Node *)malloc( sizeof(Node) );
	r->date= c;
	r->next= s;
	s= r;

	return s;
    }
}

Node *Pop(Node *s)
{
    Node *p;
    Node *q;

    if (s == NULL)
    {
	printf("Stack kong");
	exit(0);
    }
    else
    {
	p= s;
	s= s->next;
	q=(Node *)malloc( sizeof(Node) );
	q->date= p->date;
	q->next= s;
	free(p);

	return q;
    }
}

int StackEmpty(Node *s)
{
    if (s == NULL)
    {
       return 1;
    }
    else
    {
       return 0;
    }
}

main()
{
    Node *stack;
    Node *stackRight;
    Node *StackAllTop;
    Node *StackRightTop;
    char c;

    stack= NULL;
    stackRight= NULL;
    c= getchar();

    while (c != ' ')
    {
    	stack= Push(stack,c);
    	c= getchar();
    }

    while ( !StackEmpty(stack) )
    {
        StackAllTop= Pop(stack);
        stack= StackAllTop->next;

        if ( StackAllTop->date == '}' || 
	     StackAllTop->date == ']' || 
	     StackAllTop->date == ')' )
        {	
            stackRight=Push(stackRight,StackAllTop->date);
    	}
        else if ( StackAllTop->date == '{' || 
                  StackAllTop->date == '[' || 
    		  StackAllTop->date == '(' )
    	{
    	    if ( stackRight == NULL )
    	    {
	        printf("result error!!!/n");
                exit(0);
            }

            StackRightTop= Pop(stackRight);
    	    stackRight= StackRightTop->next;

    	    if ( StackAllTop->date == '(' )
    	    {
    	    	//判断是否匹配,StackAllTop->date+1 就是 ')'
    	    	if ( StackAllTop->date+1 != StackRightTop->date )	
    	    	{
    	    	    printf("result error!/n");
    	    	    exit(0);
    		}
            }
            else if ( StackAllTop->date == '[' || StackAllTop->date == '{' )
    	    {
    	    	//StackAllTop->date+1 就是 ']'或'}' 
    	    	if ( StackAllTop->date+2 != StackRightTop->date )
                {
            	    printf("result error! /n");
    	            exit(0);
    	    	}
            }

    	}	//end elseif

    }	//end while

    printf("result correct! /n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值