一、代码
#include<stdio.h>
#include<stdbool.h>
#include<malloc.h>
#define STACK_MAX_SIZE 10
/**
* 整数型栈
*/
typedef struct CharStack{
int top;
char data[STACK_MAX_SIZE];
} *CharStackPtr;
/**
* 栈的输出
*/
void outputStack (CharStackPtr paraStack){
for(int i = 0; i <= paraStack->top; i ++){
printf("%c", paraStack->data[i]);
}//of for i
printf("\r\n");
}//of outputStack
/**
* 初始化一个空栈
*/
CharStackPtr charStackInit(){
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top = -1;
return resultPtr;
} //of charStackPtr
/**
* 压栈
*/
void push(CharStackPtr paraStackPtr, int paraValue){
//step 1. 空间检查
if(paraStackPtr->top >= STACK_MAX_SIZE - 1){
printf("Cannot push element: stack full.\r\n");
return ;
} //of if
//step 2. update the top
paraStackPtr->top ++;
//step 3. push element
paraStackPtr->data[paraStackPtr->top] = paraValue;
} //of push
/**
* 弹栈
*/
char pop(CharStackPtr paraStackPtr){
//step 1. 空间检查
if(paraStackPtr->top < 0){
printf("Cannot pop element: stack empty.\r\n");
return '\0';
} //of for i
//step 2. update the top
paraStackPtr->top --;
//step 3. pop element
return paraStackPtr->data[paraStackPtr->top + 1];
} //of pop
/**
* test the push and pop functions
*/
void pushPopTest(){
printf("---- pushPopTest begins. ----\r\n");
char ch;
//initialize
CharStackPtr tempStack = charStackInit();
printf("After initialization, the stack is: ");
outputStack(tempStack);
//push
for(ch = 'a'; ch < 'm'; ch ++){
printf("Pushing %c.\r\n",ch);
push(tempStack, ch);
outputStack(tempStack);
}//of for i
//pop
for(int i = 0; i < 3; i ++){
ch = pop(tempStack);
printf("Pop %c.\r\n",ch);
outputStack(tempStack);
}//of for i
printf("---- pushPopTest ends. ----\r\n");
}//of pushPopTest
/**
*括号匹配
*/
bool bracketMatching(char* paraString, int paraLength){
//step 1. 初始化栈并将'#'作为基础
CharStackPtr tempStack = charStackInit();
push(tempStack, '#');
char tempChar, tempPopedChar;
//step 2. process the string
for(int i = 0; i < paraLength; i ++){
tempChar = paraString[i];
switch(tempChar){
case '(':
case '[':
case '{':
push(tempStack, tempChar);
break;
case ')':
tempPopedChar = pop(tempStack);
if(tempPopedChar != '('){
return false;
}//of if
break;
case ']':
tempPopedChar = pop(tempStack);
if(tempPopedChar != '['){
return false;
}//of if
break;
case '}':
tempPopedChar = pop(tempStack);
if(tempPopedChar != '{'){
return false;
}//of if
break;
default:
//do nothing
break;
}//of switch
} //of for i
tempPopedChar = pop(tempStack);
if(tempPopedChar != '#'){
return false;
}//of if
return true;
} //of bracketMatching
/**
*unit test
*/
void bracketMatchingTest(){
char* tempExpression = "[2 + (1 - 3)] * 4";
bool tempMatch = bracketMatching(tempExpression, 17);
printf("Is the expression '%s' brackt matching? %d \r\n",tempExpression, tempMatch);
tempExpression = "( ) )";
tempMatch = bracketMatching(tempExpression, 6);
printf("Is the expression '%s' brackt matching? %d \r\n",tempExpression,tempMatch);
tempExpression = "()()(())";
tempMatch = bracketMatching(tempExpression, 8);
printf("Is the expression '%s' brackt matching? %d \r\n",tempExpression,tempMatch);
tempExpression = "({}[])";
tempMatch = bracketMatching(tempExpression, 6);
printf("Is the expression '%s' brackt matching? %d \r\n",tempExpression,tempMatch);
tempExpression = ")(";
tempMatch = bracketMatching(tempExpression, 2);
printf("Is the expression '%s' brackt matching? %d \r\n",tempExpression,tempMatch);
}//of bracketMatchingTest
/**
* The entrance
*/
int main(){
//pushPopTest();
bracketMatchingTest();
return 0;
}//of main
二、运行结果
三、代码说明
规定‘#’为基础,最后弹出的如果是它则代表能够匹配;压入栈的也只有左括号,出现右括号则放在栈外与栈内的最上面的括号匹配,如果不能匹配则说明给出的括号不能匹配,返回“FALSE”。