【数据结构】3.19

括号配对题 判断(){}[]的出现是否匹配  用Stack实现

#include<iostream>
#include <stdlib.h>
using namespace std;

typedef int Status;
const int TRUE=1;
const int FALSE=0;
const int OK=1;
const int ERROR=0;
const int INFEASIBLE=-1;
const int overflow=-2;
const int STACK_INIT_SIZE=100;
const int STACKINCREMENT=10;

typedef struct{
    char orinal;
    char match;
}Bracket;


typedef struct{
    Bracket *base;
    Bracket *top;
    int stacksize;
}SqStack;

//构造一个空栈
Status InitStack(SqStack &S)
{
    S.base=(Bracket*)malloc(sizeof(Bracket)*STACK_INIT_SIZE); 
    if(!S.base) exit(overflow);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status GetTop(SqStack S,Bracket &e)
{
    if(S.top==S.base) return ERROR;
    e=*(S.top-1);
    return OK;
}

Status Push(SqStack &S,Bracket e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(Bracket*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(Bracket));  
        if(!S.base)exit(overflow);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}

Status Pop(SqStack &S,Bracket &e)
{
    if(S.top==S.base) return ERROR;
    e=*--S.top;
    return OK;
}

Status StackEmpty(SqStack S){
    if(S.base==S.top)
        return TRUE;
    else
        return FALSE;
}
#include"exercise3_19.h"

Status BracketMatch(char* input,int length)
{
	Bracket bracket1;
	Bracket bracket2;
	Bracket bracket3;
	bracket1.orinal='(';
	bracket1.match=')';
	bracket2.orinal='[';
	bracket2.match=']';
	bracket3.orinal='{';
	bracket3.match='}';
	SqStack S;
	InitStack(S);

	for(int i=0; i<length;i++)
	{
		
		char tmp=*(input+i);
		printf("%c",tmp);
		switch(tmp)
		{
		case '{':
			{
				Push(S,bracket3);
				break;
			}
		case '[':
			{
				Push(S,bracket2);
				break;
			}
		case '(':
			{
				Push(S,bracket1);
				break;
			}
		case ')':
		case ']':
		case '}':
			{
				if(StackEmpty(S))
				{
					printf("error");
					return ERROR;
				}
				else
				{
					Bracket tmp2;
					GetTop(S,tmp2);
					if(tmp==tmp2.match)
					{
						Pop(S,tmp2);
					}
					else
					{
						printf("error");
						return ERROR;
					}
				}
				break;
			}
		default:
			break;
		}
	
	}
	if(!StackEmpty(S))
	{
		printf("error");
		return ERROR;
	}
	printf("correct");
	return OK;
	
}

void main()
{
	char p[30]="3*(5+2+(2)+{[()]}){}}";
	BracketMatch(p,30);
	getchar();

}

 关键点:

1.定义了Bracket类型 使得可以直接根据栈中的元素判断是否配对

2.switch 语句中')' '}' ']' 统一处理 '{' '[' '(' 分开处理

3.别忘记switch 的 break default

4.整个过程结束后 栈必须是空的 防止 ()(这样的情况

5.在中')' '}' ']' 第一次出现时 栈不能是空的 防止 )()这样的情况

posted @ 2014-03-24 13:00  匡子语  阅读(265)  评论(0编辑  收藏  举报