【例】假设有一个算术表达式包含圆括号、方括号和花括号,编写一个函数,用来判别表达式中的括号是否正确匹配,并设计一个测试主函数。
【分析】括号匹配共有一下四种情况:
①左、右括号匹配不正确;
②右括号多于左括号;
③左括号多余右括号;
④左右括号匹配正确。
另外,还应该想到,“何时进栈”,“何时出栈”,“何时取栈顶元素”,“何时栈空”
typedef struct
{
DataType stack[MaxStackSize];
int top; //top表示顺序堆栈数组stack的当前栈顶位置
}SeqStack;
void StaticInitiate(*S)
{
S->top=0; //初始化栈顶下标值
}
int StackNotEmpty(S) //判断顺序堆栈S是否为空,非空返回1,否则返回0
{
if(S.top<=0)return 0;
else return 1;
}
int StackPush(SeqStack *S,DataType x)//把数据元素x存入顺序堆栈S中,入栈成功返回1,否则返回0
{
if(S->top>=MaxStackSize)
{
printf("堆栈已满,无法插入!\n")
return 0;
}
else
{
S->Stack[S->top]=x;
S->top++;
return 1;
}
}
int StackPop(SeqStack *S,DataType) //取出顺序堆栈S的栈顶元素值由参数d带回,出栈成功则返回1,否则返回0
{
if(S->top<=0)
{
printf("堆栈已空无数据元素出栈!\n");
return 0;
}
else
{
S->top--; //得注意top--,--top的差别
*d=S->stack[S->top];
return 1;
}
}
int StackTop(SeqStack S,DataType *d) //取栈顶数据元素值由参数d带回,成功返回1,不成功返回0
{
if(S.top<=0)
{
printf("堆栈已空!\n");
return 0;
}
else
{
*d=S.stack[S.top-1];
return 1;
}
}
测试主函数:
#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
typedef char DataType;
#include"SeqStack.h"
void ExpIsCorrect(char exp[],int n)
{
SeqStack myStack;
int i;
char c;
StackInitiate(&myStack);
for(i=0;i<n;i++)
{
if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{'))
{
StackPush(&myStack,exp[i]);
}
else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c=='(')
{
StackPop(&myStack,&c);
}
else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='(')
{
printf("左右括号匹配不正确!\n");
return 0;
}
else if(exp[i]==']'&&StackNotEmpty(myStavk)&&StackTop(myStack,&c)&&c=='[')
{
StackPop(&myStack,&c);
}
else if(exp[i]==']'&&StackNotEmpty(mySatck)&&StackTop(myStack,c)&&c!='[')
{
printf("左右括号匹配次序不正确!\n");
return;
}
else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='{')
{
StackPop(&myStack,&c);
}
else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='{')
{
printf("左右括号匹配次序不正确!\n");
return;
}
else if(((exp[i]==')')||(exp[i]==']')||(exp[i]=='}'))&&!=StackNotEmpty(myStack))
{
printf("右括号多于左括号!\n");
return;
}
}
if(StackNotEmpty(myStack))
{
printf("左括号多于右括号!\n");
}
else
{
printf("左右括号匹配正确!\n");
}
}
void main()
{
char a[]="(())abc{[]()}";
char b[]="(()))abc{[]}";
char c[]="(()()abc{[]}";
char d[]="(())abc{[]}";
int n1=strlen(a);
int n2=strlen(b);
int n3=strlen(c);
int n4=strlen(d);
ExpIsCorrect(a,n1);
ExpIsCorrect(b,n2);
ExpIsCorrect(c,n3);
ExpIsCorrect(d,n4);
}