顺序堆栈的测试问题
小弟刚学数据结构 测试顺序堆栈的括号匹配函数时结果总是不正确 实在找不出原因了 望高手指教 感激不尽!!顺序栈头文件:SeqStack.h
//顺序堆栈存储结构 //////////////////////////////////////////////////////////
typedef struct
{
DataType stack[MaxStackSize];
int top; //top标示当前元素个数
}SeqStack;
//顺序堆栈的操作实现/////////////////////////////////////////////////////////
//初始化StackInitiate(S)
void StackInitiate(SeqStack *S)
{
S->top=0;
}
//判断非空否StackNotEmpty(S)
int StackNotEmpty(SeqStack S)
//判断顺序栈非空否,非空返回1,否则返回0;
{
if (S.top<=0) return 0; //这个地方为什么不能用S->top而只能用‘.’?而下边的函数能用?
else return 1 ; //并且后边的StackTop也必须用‘.’才能编译正确?为什么?
}
//入栈StackPush(SeqStack *S,DataType x)
int StackPush(SeqStack *S,DataType x)
//把数据元素x压入顺序栈S中,入栈成功返回1,否则返回0;
{
if(S->top>=MaxStackSize)
{
printf("堆栈已满无法插入!");
return 0;
}
else
{
S->stack[S->top]=x;
S->top++;
return 1;
}
}
//出栈StackPop(SeqStack *S,DataType *d)
int StackPop(SeqStack *S,DataType *d)
//弹出顺序栈的栈顶元素值到d,出栈成功返回1,否则返回0;
{
if(S->top<=0)
{
printf("堆栈已空无数据元素出栈!");
return 0;
}
else
{
S->top--;
*d=S->stack[S->top];
return 1;
}
}
//取栈顶元素StackTop(SeqStack S,DataType *d)
int StackTop(SeqStack S,DataType *d)
//取顺序堆栈S中的栈顶元素值到参数d,成功返回1,失败返回0;
{
if(S.top<=0)
{
printf("堆栈已空!!");
return 0;
}
else
{
*d=S.stack[S.top-1];
return 1;
}
}
测试函数如下:(判断括号匹配)
#include <stdio.h>
#include <string.h>
#include <stdlib.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=1;i<n;i++)
{
if((exp[i]=='(')||(exp[i]=='[')||(exp[i]=='{'))
StackPush(&myStack,exp[i]); //入栈
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]==']'&&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]=='}'&&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");
}
int 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);
}