一、题目
给一组括号数组例如"((([{}])))",写程序判断它们是否能刚好左右括号相匹配,并返回TRUE or FALSE
二、解答
用栈来匹配括号,
- 如果是左括号就入栈,
- 如果是右括号,
- 先判断栈是否为空
- 若为空则肯定不能刚好匹配;
- 若不为空 则判断是否与栈顶括号恰好匹配,
- 匹配失败直接返回False
- 匹配成功 则弹出栈顶元素后进行下一轮循环
- 先判断栈是否为空
#include<stdio.h>
#define MAX_SIZE 10
typedef struct {
char data[MAX_SIZE];
int top; //栈顶元素是指向下一个(更上层)空位的
/**
_________________
top->|________________|
_________________
|___data[Max]____|
_________________
|________________|
...
_________________
|_____data[0]____|
*/
}SqStack;
/**
C语言不可以在结构体中初始化变量
所以需要定义一个init函数 用来初始化各种变量
否则成员的值都是未初始化的 会出现错误。
*/
void initStack(SqStack *s){
s->top = 0;
}
/**
输出栈的全部元素
*/
void printStack(SqStack s){
int i;
for(i = s.top-1 ; i >= 0 ; i--){
printf("%c \n",s.data[i]);
}
}
/**
栈空返回1
否则返回0
*/
int stackEmpty(SqStack s){
if(s.top <= 0) return 1;
return 0;
}
/**
栈满返回1
否则返回0
*/
int stackFull(SqStack s){
if(s.top >= MAX_SIZE) return 1;
return 0;
}
/**
入栈
*注意c语言是不支持true&false ,需要用1/0表示t/f
*/
int push(SqStack *s,char e){
if(stackFull(*s)) return 0;
s->data[s->top++] = e;
return 1;
}
/**
出栈
*/
int pop(SqStack *s , char *e){
if(stackEmpty(*s)) return 0;
*e = s->data[--s->top];
return 1;
}
int bracketCheck(char bracket[],int length){
SqStack s;
initStack(&s);
int i;
for(i = 0 ; i < length ; i++){
// printf("第%d次\n",i);
// printStack(s);
// printf("-----------\n");
if(bracket[i] == '(' || bracket[i] == '[' || bracket[i] == '{'){
push(&s,bracket[i]);
continue;
}
//如果是右括号
// 首先判断栈为空 如果栈为空直接返回0
// 栈不为空 再判断是否与相应的左括号匹配 不匹配返回0
if(stackEmpty(s)) return 0;
char e;
e = pop(&s,&e);
if(bracket[i] == '(' && e != ')') return 0;
if(bracket[i] == '[' && e != ']') return 0;
if(bracket[i] == '{' && e != '}') return 0;
}
// printf("loop finished!");
if(!stackEmpty(s)) return 0; //栈不为空即 还有残余的左括号未匹配 错误
return 1;
}
int main(){
char brackets[][MAX_SIZE] = {
"((()))",
"(()(()",
"abcdefg",
"{[()]}",
"({}abc)",
"",
"((",
"))",
"{{}}()[]"
};
int numTests = sizeof(brackets) / sizeof(brackets[0]); //9
/**
这里要特殊说明 为什么brackets数组中的每个字符串长度都不相同 但是得到的numTests确实正确的9
因为会自动补齐至最长长度的字符串
char c[3][8]={"apple","orange","banana"};
以上初始化语句中,二维数组的第一维大小均可省略。数组 c 的逻辑结构如下所示:
0 1 2 3 4 5 6 7
c[0] a p p l e \0 \0 \0
c[1] o r a n g e \0 \0
c[2] b a n a n a \0 \0
*/
printf("Total Test Nums : %d \n",numTests);
int i;
for (i = 0; i < numTests; i++) {
int length = strlen(brackets[i]);
int result = bracketCheck(brackets[i], length);
printf("Test %d: %s - Result: %d\n", i + 1, brackets[i], result);
}
/**
Total Test Nums : 9
Test 1: ((())) - Result: 1
Test 2: (()(() - Result: 0
Test 3: abcdefg - Result: 0
Test 4: {[()]} - Result: 1
Test 5: ({}abc) - Result: 0
Test 6: - Result: 1
Test 7: (( - Result: 0
Test 8: )) - Result: 0
Test 9: {{}}()[] - Result: 1
*/
return 0;
}
/**
**测试过程
int main(){
SqStack s;
initStack(&s);
int i;
for(i = 1 ; i <= MAX_SIZE +2 ; i++){
if(!stackFull(s)) push(&s,'(');
else printf("%d %d,FULL!!\n",i,s.top);
}
printStack(s);
while(!stackEmpty(s)){
//这里只需要定义一个普通变量e,然后将e的地址传入函数
//函数中定义指针e 那么就可以将函数中e的值带回。
char e;
pop(&s,&e);
printf("%c ",e);
}
printf("\n");
printStack(s);
}
*/