#include <stdbool.h>
#include <stdio.h>
#include <malloc.h>
#define STACK_MAX_SIZE 10
/**
* Linear stack of integers. The key is data.
*/
typedef struct CharStack{
int top;
char data[STACK_MAX_SIZE];//The maxium length is fixed.
}*CharStackPtr;
/**
*Output the stack.
*/
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.
/**
*Initialize an empty char stack. No error checking for this function.
*@param paraStackPtr The pointer ti the stack.It must be a pointer to change the stack.
*@param paraValues The value to be pubshed.
*/
CharStackPtr charStackInit(){
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top = -1;
return resultPtr;
}//Of charStackInit.
/**
*Push an element to the stack.
*@param paraValue The value to be pushed.
*/
void push(CharStackPtr paraStackPtr,int paraValue){
//Step 1. Space check.
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
/**
*Pop an element from the stack.
*@return The popped value.
*/
char pop(CharStackPtr paraStackPtr){
//Step 1. Space check.
if(paraStackPtr->top<0){
printf("Cannot pop element: stack empty.\r\n");
return '\0';
} //Of if
//Step 2. Update the top.
paraStackPtr->top --;
//Step 3. Pop element.
return paraStackPtr->data[paraStackPtr->top+1];
}//Of pop
/**
* Test the push function.
*/
void pushPopTest(){
printf("----pushPopTest begins.----\r\n");
char ch;
//Initialize.
CharStackPtr tempStack = charStackInit();
printf("After initialization,the stack is:");
outputStack(tempStack);
//Pop.
for(ch = 'a';ch < 'm';ch ++){
printf("Pushing %c.\r\n",ch);
push(tempStack,ch);
outputStack(tempStack);
}//OF for it
//Pop.
for(int i = 0;i < 3;i++){
ch = pop(tempStack);
printf("Pop %c.\r\n",ch);
outputStack(tempStack);
} //Of for it
printf("----pushPopTest ends.----\r\n");
}//Of puPopTest
/**
*Is the bracket matching?
*
*@param paraString The given expression.
*@return Match or not.
*/
bool bracketMatching(char* paraString,int paraLength){
//Step 1. Initialize the stack through pishing a '#' at the bottom.
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;
}
/**
* Unit test.
*/
void bracketMatchingTest(){
char* tempExpression = "[2 + (1 - 3)]*4";
bool tempMatch = bracketMatching(tempExpression,17);
printf("Is the expression '%s' bracket matching! %d\r\n",tempExpression,tempMatch);
tempExpression = "() )";
tempMatch = bracketMatching(tempExpression,6);
printf("Is the expression '%s' bracket matching? %d\r\n",tempExpression,tempMatch);
tempExpression = "()()(())";
tempMatch = bracketMatching(tempExpression,8);
printf("Is the expression '%s' bracket matching? %d\r\n",tempExpression,tempMatch);
tempExpression = "({}[])";
tempMatch = bracketMatching(tempExpression,6);
printf("Is the expression '%s' bracket matching? %d\r\n",tempExpression,tempMatch);
tempExpression = ")(";
tempMatch = bracketMatching(tempExpression,2);
printf("Is the expression '%s' bracket matching? %d\r\n",tempExpression,tempMatch);
}//Of bracketMatchingTest
/**
The entrance.
*/
void main(){
//pushPopTest();
bracketMatchingTest();
}//Of main.
结果: