代码:
#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
#define STACK_MAX_SIZE 10
typedef struct CharStack
{
int top;
int data[STACK_MAX_SIZE];
}*CharStackPtr;
//打印栈
void outputStack(CharStackPtr paraStack)
{
int i;
for(i=0;i<=paraStack->top;i++)
{
printf("%c ",paraStack->data[i]);
}
printf("\r\n");
}
//初始化一个空的字符栈
CharStackPtr charStackInit()
{
CharStackPtr resultPtr=(CharStackPtr)malloc(sizeof(struct CharStack));
resultPtr->top=-1;
return resultPtr;
}
//压一个元素入栈
void push(CharStackPtr paraStackPtr,int paraValue)
{
//1.空间检查
if(paraStackPtr->top>=STACK_MAX_SIZE-1)
{
printf("Cannot push element: stack full.\r\n");
return;
}
//2.更新栈顶
paraStackPtr->top++;
//3.压元素入栈
paraStackPtr->data[paraStackPtr->top]=paraValue;
}
//弹一个元素出栈
char pop(CharStackPtr paraStackPtr)
{
//1.空间检查
if(paraStackPtr->top<0)
{
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}
//2.更新栈顶
paraStackPtr->top--;
//3.取元素
return paraStackPtr->data[paraStackPtr->top+1];
}
//
void pushPopTest()
{
printf("---- pushPopTest begins. ----\r\n");
char ch;
int i;
//初始化
CharStackPtr tempStack=charStackInit();
printf("After initialization, the stack is: ");
outputStack(tempStack);
//入栈
for(ch='a';ch<'m';ch++)
{
printf("Pushing %c.\r\n",ch);
push(tempStack,ch);
outputStack(tempStack);
}
//出栈
for(i=0;i<3;i++)
{
ch=pop(tempStack);
printf("Pop %c.\r\n",ch);
outputStack(tempStack);
}
printf("---- pushPopTest end. ----\r\n");
}
//利用栈匹配括号
bool bracketMatching(char* paraString,int paraLength)
{
//1.在栈底压入'#'来初始化栈
CharStackPtr tempStack=charStackInit();
int i;
push(tempStack,'#');
char tempChar,tempPopedChar;
//2.处理串
for(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;
}
break;
case ']':
tempPopedChar=pop(tempStack);
if(tempPopedChar!='[')
{
return false;
}
break;
case '}':
tempPopedChar=pop(tempStack);
if(tempPopedChar!='{')
{
return false;
}
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);
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\![在这里插入图片描述](https://img-blog.csdnimg.cn/94988d6cbffb466e822759745d663bf0.jpeg#pic_center)
n",tempExpression,tempMatch);
tempExpression=")(";
tempMatch=bracketMatching(tempExpression,2);
printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);
}
//程序执行入口
void main()
{
bracketMatchingTest();
}
运行结果:
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。