棧的應用-括號的匹配檢驗
阿新 • • 發佈:2019-04-03
問題描述
假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,即([]())或[([][])]等為正確的格式,[(]或[())]等為非法格式,試寫一個演算法檢驗括號的格式是否正確。
解題思路
使用棧這種資料結構,當遇到左半邊的符號時,進棧,如遇到右半邊的符號時,出棧操作,如果符號不是同一隊符號,則重新入棧,程式結束後,根據棧是否為空棧判斷括號的格式是否正確,如果是正確,則棧為空棧,否則相反。
程式是根據嚴蔚敏老師的資料結構一書寫就的,最後判斷括號是否全匹配的操作我有點迷。
程式實現
#include <stdio.h>
#include <stdlib.h>
/**
* 棧的簡單操作:判斷括號是否成對
*/
#define STACK_INIT_SIZE 100
typedef struct Stack {
char *base;
char *top;
int stackSize;
} SqStack;
void initStack(SqStack *stack);
int pushStack(SqStack *stack, char element);
int popStack(SqStack *stack, char *element);
int main(int argc, char *argv[]) {
SqStack stack;
initStack(&stack);
printf("請輸入要匹配的括號:\n");
char element, result;
scanf("%c", &element);
while (element != '#') {
if ((int)element == 91 || (int)element == 40) {
pushStack(&stack, element);
} else {
popStack(&stack, &result);
if ((element == ']' && result != '[') || (element == ')' && result != '(')) {
pushStack(&stack, result);
}
}
getchar();
scanf("%c", &element);
}
if (*stack.top == *stack.base) {
printf("括號全匹配!");
} else {
printf("括號匹配失敗!");
}
return 0;
}
/**
* 初始化棧
*/
void initStack(SqStack *stack) {
stack->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!stack->base) {
exit(-1);
}
stack->stackSize = 100;
stack->top = stack->base;
}
/**
* 入棧操作
*/
int pushStack(SqStack *stack, char element) {
// 棧已滿
if (stack->top - stack->base >= stack->stackSize) {
return -1;
}
*stack->top++ = element;
return 1;
}
/**
* 出棧操作
*/
int popStack(SqStack *stack, char *element) {
// 棧已空
if (stack->top == stack->base) {
return -1;
}
*element = *--stack->top;
return 1;
}