输入括号平衡的检测程序

     使用编译器编译程序时,程序出错时编译器会告诉我们那里输入有误。程序中使用到的各种括号是否匹配是编译器检验程序是否出错的一个指标。有时候我们在程序的最后少写了个右花括号},尽管实际只少写了个},可能会导致编译器报上百个错误。既然编译器都有这个括号匹配功能,试试自己能否的实现括号匹配问题。为使问题简单化,输入括号仅限花括号{}和方括号[]。

查过资料后,发现使用栈可以很好的解决上述的问题。开始时初始化栈为空。当读取左括号(见注)时,将相应的左括号压入栈中。当读取的是右括号时,从栈中弹出数据,并与右括号比较来检查括号是否匹配。如果括号匹配,循环上述步骤。如果不匹配,则输入的括号不平衡。将括号读取完成后,检测栈是否为空。栈为空则输入的括号相平衡。否则,输入括号不相匹配。

 

注:左括号为 {  [

        左括号为 }  ]

代码组织: stack.c 和stack.h -------栈的操作

                      main.c                  ---------使用栈解决问题

程序的功能实现括号的平衡。符号数据输入为大括号{ }或者中括号 [ ]

[root@lumotuwe] gcc main.c stack.c -o main

[root@lumotuwe] ./main [ { } ] { [ ] }

 

main.c

/************************************************************************
*	File Name 			:symbol blance
*	Copyright			:scut,All Rights Reserved.
*	Create Data			:2012/11/22	
*	Author				:lumotuwe	
*	Abstruct Description		:[root@localhost] ./main
*						  [ ] ( )
*
************************************************************************/

#include<stdio.h>
#include<string.h>
#include "stack.h"
#include "stdlib.h"

int main(int argc, char ** argv)
{
	int i;
	Stack S;
	if( (argc-1) % 2 != 0 ) 
		{
		printf( "Balance no\n" );	
		return 2;
		}
	S = CreateStack( );
	for( i=1; i<argc; i++ )
	{
	switch ( argv[i][0] )
		{
		case 91   :  	Push( 91, S );break;     //[
		case 123  :  	Push( 123, S );break;    //(
		case 125  :  	if( Pop( S ) != 123 ) goto erro1;break;
		case 93   :  	if( Pop( S ) != 91 ) goto erro1;break;
		default   : 	goto erro2;
		}
	}
	if( IsEmpty( S ) ) 
			{
			printf( "Balance yes\n" );
			return 0;
			}
	erro1: 	
		printf( "Balance no\n" );
		return 3;
	erro2:
 		printf( "input erro,please input only""["" or"" }""\n" );
		return 2;
}

 

stack.h

#ifndef _Satack_h

struct Node
{
	int Element;
	struct Node *Next;	
};
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int	IsEmpty( Stack S );
Stack   CreateStack( void );
void 	DisposeStack( Stack S );
void 	MakeEmpty( Stack S );
void	Push( int X, Stack S );
int	Top( Stack S );
int	Pop(Stack S);
#endif


 

 

stack.c

#include "stack.h"
#include <stdlib.h>
#include <stdio.h>
/* Return true if S is empty*/
int	IsEmpty( Stack S )
{
	return S->Next == NULL;

}
/*Return the head of Stack*/
/*Retrun NULL if no memory*/
Stack  CreateStack( void )
{
	Stack Head;
	Head=( Stack )malloc( sizeof( struct Node ) );
	if (Head == NULL)
		{
		printf( "Out of space" );
		return Head;
		}
	Head->Next = NULL;
	return Head;
}
void 	DisposeStack( Stack S )
{

}
void 	MakeEmpty( Stack S )
{

}
void	Push( int X, Stack S )
{
	PtrToNode Tmp;
	Tmp = ( PtrToNode ) malloc( sizeof( struct Node ) );
	if( Tmp == NULL )
		printf( "Out of space" );
	Tmp->Next = S->Next;
	S->Next = Tmp;
	Tmp->Element = X;
}
int	Top( Stack S )
{
	
}
int	Pop(Stack S)
{	
	int data;
	if( IsEmpty( S ) ) return 0;
	PtrToNode Tmp = S->Next;
	data = S->Next->Element;
	S->Next = S->Next->Next;
	free(Tmp);
	return data;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值