棧的總結以及括號匹配問題的實現
棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空棧,棧又稱為後進先出的線性表。
實現棧一般有順序棧和鏈式棧兩種方式,順序棧所有的操作時間複雜度僅為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");
}
}