使用编译器编译程序时,程序出错时编译器会告诉我们那里输入有误。程序中使用到的各种括号是否匹配是编译器检验程序是否出错的一个指标。有时候我们在程序的最后少写了个右花括号},尽管实际只少写了个},可能会导致编译器报上百个错误。既然编译器都有这个括号匹配功能,试试自己能否的实现括号匹配问题。为使问题简单化,输入括号仅限花括号{}和方括号[]。
查过资料后,发现使用栈可以很好的解决上述的问题。开始时初始化栈为空。当读取左括号(见注)时,将相应的左括号压入栈中。当读取的是右括号时,从栈中弹出数据,并与右括号比较来检查括号是否匹配。如果括号匹配,循环上述步骤。如果不匹配,则输入的括号不平衡。将括号读取完成后,检测栈是否为空。栈为空则输入的括号相平衡。否则,输入括号不相匹配。
注:左括号为 { [
左括号为 } ]
代码组织: 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; }