1. 程式人生 > >棧的總結以及括號匹配問題的實現

棧的總結以及括號匹配問題的實現

        棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空棧,棧又稱為後進先出的線性表。

        實現棧一般有順序棧和鏈式棧兩種方式,順序棧所有的操作時間複雜度僅為O(1),相對於鏈式棧的實現更為簡單。在本文中我將採用靜態順序表的尾插和尾刪這種方式來實現順序棧。

        首先定義有關於棧的結構體,結構體中包括DataType型的陣列 array和int型的top,其中top標記棧的大小。然後完成了有關棧的初始化以及銷燬的定義,程式碼如下:

typedef   int  DataType;

#define MAXSIZE (100)

typedef   struct{
	DataType  array[MAXSIZE];
	int top;//起了個別名,含義還是size
}Stack;

//棧初始化
void   StackInit(Stack *ps)
{
	ps->top = 0;
}

//棧的銷燬
void   StackDestory(Stack *ps)
{
	ps->top = 0;
}

           通常,棧的基本操作包括壓棧和出棧兩個操作,除此還可以實現彈出棧頂元素,返回棧的大小,判斷棧是否為空等。這部分相關程式碼如下:

//棧中入放一個元素
void   StackPush(Stack *ps,DataType data)
{
	assert(ps->top < MAXSIZE);
	ps->array[ps->top++] = data;

}

//棧中彈出一個元素
void   StackPop(Stack *ps)
{
	assert(ps->top>0);
	ps->top--;
}

//彈出棧頂元素
DataType   StackTop(const  Stack *ps)
{
	assert(ps->top > 0);
	return ps->array[ps->top - 1];
}

//返回棧的大小
int  StackSize(const Stack *ps)
{
	return  ps->top;
}

//返回棧是否為空
int StackEmpty(const Stack *ps)
{
	return ps->top == 0 ? 1 : 0;
}

              上面就是我有關棧的一些基本知識的總結,下面我將敘述用棧來實現括號匹配的問題。關於括號匹配的問題,基本可以分為下面4種情況:

              1. char   a[  ] = " ( ( ) ) a b c { [ ( ] ) } " ;  //  左右括號次序匹配 不正確               2. char   b[  ] = " ( ( ) ) ) a b c { [ ] } " ;    //  右括號多於左括號               3. char   c[  ] = " ( ( )( ) a b c { [ ] } " ;      //  左括號多於右括號               4. char   d[  ] = " ( ( ) ) a b c { [ ] ( ) } 

" ;  //  左右括號匹配正確               對於用棧實現這個問題,我的思路可以概括為:

             1.首先定義一個棧用來存放元素,然後依次遍歷整個字串陣列。

              2.如果元素是左括號,直接入棧。

              3.如果元素是除了左右括號之外的元素,直接忽略。

             4.如果元素是右括號,首先判斷棧內是否有元素。如果棧空,則結果是右括號多。

             5. 如果棧不為空,比較棧頂元素是否和當前右括號匹配。如果不匹配,則結果為左右括號不匹配。如果匹配成功,當前左括號出棧,接著向後遍歷整個字串陣列,依次重複步驟2——5操作,直到整個陣列遍歷完為止。

.            6.當整個陣列遍歷完時,如果棧內還有括號,結果是左括號多,否則結果是匹配成功。

             相關程式碼如下:

//括號匹配問題
void  MatchBrackets(const  char *str)
{
	Stack stack;
	StackInit(&stack);

	const char *p = str;
	char left;
	while (*p != '\0')
	{
		switch (*p)
		{
		case '{':
		case '[':
		case '(':
			StackPush(&stack, *p);
			break;
		case '}':
		case ']':
		case ')':
			if (StackEmpty(&stack))
			{
				printf("右括號多\n");
				return;
			}
			left = StackTop(&stack);
			StackPop(&stack);
			if (!((left == '{'&&*p == '}')
				|| (left == '['&&*p == ']')
				|| (left == '('&&*p == ')')))
			{
				printf("左右括號不匹配\n");
				return;
			}
			break;
		default:
			break;
		}
		p++;
	}
	if (!StackEmpty(&stack))
	{
		printf("左括號多\n");
	}
	else
	{
		printf("匹配成功\n");
	}
}