#include<iostream>
using namespace std;
#define STACK_MAX_SIZE 10
typedef struct CharStack{
int top;//头指针
int data[STACK_MAX_SIZE];//数据域
}*CharStackPtr;
//定义数据结构
void outputStack(CharStackPtr paraStack){
for (int i = 0;i<=paraStack->top;i++) {
printf("%c ",paraStack->data[i]);
}
printf("\r\n");
}
//输出栈中的元素
CharStackPtr charStackInit(){
CharStackPtr resultPtr=(CharStackPtr)malloc(sizeof(CharStack));
resultPtr->top=-1;
return resultPtr;
}
//初始化
void push(CharStackPtr paraStackPtr,int paraValue) {
if (paraStackPtr->top>=STACK_MAX_SIZE-1) {
printf("Cannot push element: stack full.\r\n");
return;
}
paraStackPtr->top++;
paraStackPtr->data[paraStackPtr->top]=paraValue;
}
//入栈
char pop(CharStackPtr paraStackPtr) {
if (paraStackPtr->top<0) {
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}
paraStackPtr->top--;
return paraStackPtr->data[paraStackPtr->top+1];
}
//出栈
void pushPopTest(){
char ch;
printf("---- pushPopTest begins. ----\r\n");
CharStackPtr tempStack=charStackInit();
printf("After initialization, the stack is: ");
outputStack(tempStack);
for(char ch='a';ch<'m';ch ++) {
printf("Pushing %c.\r\n",ch);
push(tempStack,ch);
outputStack(tempStack);
}
for(int i=0;i<3;i++) {
ch=pop(tempStack);
printf("Pop %c.\r\n", ch);
outputStack(tempStack);
}
printf("---- pushPopTest ends. ----\r\n");
}
bool bracketMatching(char* paraString, int paraLength){
CharStackPtr tempStack=charStackInit();
push(tempStack,'#');
char tempChar,tempPopedChar;
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;//不满足匹配,直接返回false,结束程序
}
break;
case ']'://判断是否匹配
tempPopedChar=pop(tempStack);
if (tempPopedChar!='['){
return false;//不满足匹配,直接返回false,结束程序
}
break;
case '}'://判断是否匹配
tempPopedChar=pop(tempStack);
if (tempPopedChar!='{'){
return false;//不满足匹配,直接返回false,结束程序
}
break;
default:
break;
}
}
tempPopedChar=pop(tempStack);
if (tempPopedChar!='#') {
return false;
}
return true;
}
//判断括号是否匹配
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);
char* tempExpression1="( ) )";
tempMatch=bracketMatching(tempExpression1, 6);
printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);
char* tempExpression2="()()(())";
tempMatch=bracketMatching(tempExpression2, 8);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
char* tempExpression3="({}[])";
tempMatch = bracketMatching(tempExpression3, 6);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
char* tempExpression4=")(";
tempMatch = bracketMatching(tempExpression4, 2);
printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
}
//测试样例
int main(){
bracketMatchingTest();
return 0;
}
这段代码实现了一个基于堆栈的括号匹配算法。在这个算法中,使用了一个自定义的栈数据结构CharStack
,支持入栈push
和出栈pop
操作,并且提供了括号匹配检查函数bracketMatching
来判断一个给定的表达式中的括号是否匹配。
在main
函数中,通过调用bracketMatchingTest
函数来测试括号匹配算法的准确性。bracketMatchingTest
函数会对不同的表达式进行括号匹配测试,并输出测试结果。
整体来说,这段代码展示了如何使用堆栈数据结构来实现括号匹配算法,通过模拟入栈和出栈操作来检查括号是否匹配。这个算法的实现简洁明了,能够有效地判断表达式中的括号是否匹配,从而帮助我们更好地理解堆栈的应用和括号匹配的原理。
学习这段代码的过程中,我深刻体会到了数据结构和算法在实际编程中的重要性,以及堆栈在处理括号匹配问题中的巧妙运用。同时,通过阅读代码和测试样例,我对堆栈的基本操作和括号匹配算法有了更深入的理解,这对我的编程能力提升和算法思维培养都有着积极的意义。