| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 900 人关注过本帖
标题:顺序堆栈的测试问题
只看楼主 加入收藏
gengshu1111
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-9-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
顺序堆栈的测试问题
小弟刚学数据结构  测试顺序堆栈的括号匹配函数时结果总是不正确  实在找不出原因了  望高手指教 感激不尽!!

顺序栈头文件: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);
 
 }
搜索更多相关主题的帖子: 堆栈 顺序 
2009-09-06 18:16
王小毛
Rank: 2
等 级:论坛游民
帖 子:5
专家分:20
注 册:2009-9-7
收藏
得分:10 
int StackNotEmpty(SeqStack S)
//判断顺序栈非空否,非空返回1,否则返回0;
{
    if (S.top<=0)  return 0;              //这个地方为什么不能用S->top而只能用‘.’?而下边的函数能用?
    else return 1 ;                       //并且后边的StackTop也必须用‘.’才能编译正确?为什么?
}

首先申明我也是初学者,不是所谓的高手,只是发表下自己的看法,如果有错,望指正:
int int StackNotEmpty(SeqStack *S)
{
    if (S->top<=0)  return 0;              
    else return 1 ;                       
}
这是不是跟你传进来的参数有关系,你传的是S时,它就只能用S.top形式,而上面的*S那个可以。这就要了解结构体中元素的两种访问方式了:
 1.c语言提供了成员操作符->来通过指针访问结构体的成员,如果一个指针被赋值为一个结构体的地址,那么结构体是可以通过下面的方式来访问的:
    S->top以及(*S).top这两种方式来访问的,这也就解释了你说的两处地方不能用->的原因。因为它是要通过指针来表示的,你的程序我编译了一下,确实只有一个结果是正确的,程序没来得及仔细看,再有时间回复吧,希望能帮到你!
 
2009-09-07 17:50
hwdwow
Rank: 2
等 级:论坛游民
帖 子:119
专家分:98
注 册:2009-3-21
收藏
得分:10 
SeqStack *S是更高效率的传参方式,建议全用这种。看别人的程序通常很累。
但是太明显了 for(i=1;i<n;i++);这有问题, C语言数组下标从0开始!
2009-09-08 06:44
gengshu1111
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-9-6
收藏
得分:0 
谢谢两位高手!!!!问题解决了!!!!
2009-09-08 22:16
快速回复:顺序堆栈的测试问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017916 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved