【数据结构】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.在中')' '}' ']' 第一次出现时 栈不能是空的 防止 )()这样的情况

你可能感兴趣的:(数据结构)