注册 登录
编程论坛 数据结构与算法

求助:顺序栈的建立和插入元素出现问题

守望之殇 发布于 2011-03-31 21:41, 1211 次点击
这是basic.h文件

#include"stdio.h"
#define StackSize 100

typedef int ElemType;
typedef struct
{
  ElemType *top;
  ElemType *base;
  int stacksize;
}SeqStack;

void InitStack(SeqStack *S)
{
  S->base=(ElemType *)malloc(sizeof(ElemType)*StackSize);
  if(S->base==NULL)
    exit(1);
  S->top=S->base;
  S->stacksize=StackSize;
}

int EmptyStack(SeqStack S)
{
  if(S.top==S.base)
    return 1;
  else
    return -1;
}

int FullStack(SeqStack S)
{
  if(S.top-S.base==StackSize)
    return 1;
  return -1;
}

int InsertElem(SeqStack *S,ElemType x)
{
  if(FullStack(*S)==1)
    return -1;
  *(S->top++)=x;
  return 1;
}

int GetTop(SeqStack S,ElemType *x)
{
  if(EmptyStack(S)==1)
    return -1;
  x=S.top-1;
  return 1;
}

int DeleteTop(SeqStack *S,ElemType *x)
{
  if(EmptyStack(*S)==1)
    return -1;
  x=--S->top;
  return 1;
}

void PrintStack(SeqStack S)
{
  int i;
  ElemType *p;
  if(EmptyStack(S)==1)
    printf("The Stack is Empty!\n");
  else
    {
      printf("The Stack is:");
      for(p=S.base,i=0;i<S.top-S.base;i++,p++)
        printf("%d,",*p);
    }


下面是insert.c文件
#include"stdio.h"
#include"basic.h"
main()
{
  int i=1;
  ElemType x;
  SeqStack *S;
  InitStack(S);
  printf("Input elem%d:",i++);
  scanf("%d",&x);
  while(x!=0)
    {
      InsertElem(S,x);
      printf("Input elem%d:",i++);
      scanf("%d",&x);
    }
  PrintStack(*S);
  printf("Input what to insert:");
  scanf("%d",&x);
  if(x!=0)
    InsertElem(S,x);
  PrintStack(*S);
  getch();
}
为什么编译的时候没有反应,原先是可以的,后来加了这一段就不行了
printf("Input what to insert:");
  scanf("%d",&x);
  if(x!=0)
    InsertElem(S,x);
  PrintStack(*S);
17 回复
#2
outsider_scu2011-03-31 22:07
我眼拙,没看出你这栈是什么实现 的?
数组?可是我们看见数组操作。
#3
守望之殇2011-03-31 22:11
是用数组实现的
#4
outsider_scu2011-03-31 22:13
typedef struct
{
  ElemType *top;
  ElemType *base;
  int stacksize;
}SeqStack;

数组在哪里?只是两个指针?
还是你这是什么高级方法?
#5
守望之殇2011-03-31 22:15
是有个调用函数
void InitStack(SeqStack *S)
{
  S->base=(ElemType *)malloc(sizeof(ElemType)*StackSize);
  if(S->base==NULL)
    exit(1);
  S->top=S->base;
  S->stacksize=StackSize;
}
然后在插入元素
int InsertElem(SeqStack *S,ElemType x)
{
  if(FullStack(*S)==1)
    return -1;
  *(S->top++)=x;
  return 1;
}
#6
outsider_scu2011-03-31 22:35
哎,我无能啊,看了这么久也没弄明白。
#7
守望之殇2011-03-31 22:38
回复 5楼 守望之殇
还是谢谢了
我只知道我的PrintStack写错了,没有符合栈的规律
#8
寒风中的细雨2011-04-01 09:57
程序代码:
/*求助:顺序栈的建立和插入元素出现问题
这是basic.h文件
*/

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define StackSize 100

typedef int ElemType;
typedef struct
{
  ElemType *top;
  ElemType *base;
  int stacksize;
}SeqStack;

SeqStack * InitStack(SeqStack *S)
{
    S = (SeqStack *) malloc (sizeof(SeqStack));
    if( NULL == S )
    {
        printf("\t malloc failed!\n");
        exit( -1 );
    }
    S->base = (ElemType *)malloc(sizeof(ElemType)*StackSize);
    if(S->base==NULL)
    {
        exit(1);
    }
    S->top = S->base;
    S->stacksize = StackSize;

    return S;
}

int EmptyStack(SeqStack S)
{
  if( S.top == S.base )
    return 1;
  else
    return -1;
}

int FullStack(SeqStack S)
{
  if(S.top-S.base==S.stacksize)
    return 1;
  return -1;
}

int InsertElem(SeqStack *S,ElemType x)
{
  if(FullStack(*S)==1)
    return -1;
  //*(S->top++)=x;
  *S->top++ = x;
  return 1;
}

int GetTop(SeqStack S,ElemType *x)
{
  if(EmptyStack(S)==1)
    return -1;
  *x=*S.top-1;

  return 1;
}

int DeleteTop(SeqStack *S,ElemType *x)
{
  if(EmptyStack(*S)==1)
    return -1;
  *x = *--S->top;
  return 1;
}

void PrintStack(SeqStack S)
{
  if(EmptyStack(S)==1)
    printf("The Stack is Empty!\n");
  else
  {
      printf("\tThe Stack is\n");
      while( S.top != S.base )
      {
          printf("%d ", *--S.top );
      }

      printf("\n");
  }
}
#9
寒风中的细雨2011-04-01 09:57
程序代码:
/*下面是insert.c文件*/
#include"basic.h"
#include <conio.h>

int main()
{
    int i=1;
    ElemType x;
    SeqStack *S = NULL;
    S = InitStack(S);
    printf("Input elem%d:",i++);
    scanf("%d",&x);
    while(x!=0)
    {
        InsertElem(S,x);
        printf("Input elem%d:",i++);
        scanf("%d",&x);
    }
    PrintStack(*S);
    printf("Input what to insert:");
    scanf("%d",&x);
    if(x!=0)
        InsertElem(S,x);
    PrintStack(*S);
    getch();

    return 0;
}
/*为什么编译的时候没有反应,原先是可以的,后来加了这一段就不行了
printf("Input what to insert:");
  scanf("%d",&x);
  if(x!=0)
    InsertElem(S,x);
  PrintStack(*S);
*/
#10
寒风中的细雨2011-04-01 09:58
继续努力 很不错
#11
outsider_scu2011-04-01 10:29
受益了,哈哈。。
#12
守望之殇2011-04-04 10:57
回复 8楼 寒风中的细雨
谢谢帮助~~
可是我这个程序出现错误不是由于你给我指出的那个错误,
是由于这行
printf("\nInput what to insert:");
字符太多了,我试过把字符缩短就可以正常
可是我不知道为什么不行?
跟我是在虚拟机下编译有关吗?
#13
寒风中的细雨2011-04-04 12:08
#include"stdio.h"
#include"basic.h"
main()
{
  int i=1;
  ElemType x;
  SeqStack *S;
  InitStack(S);
  printf("Input elem%d:",i++);
 

void InitStack(SeqStack *S)
{
  S->base=(ElemType *)malloc(sizeof(ElemType)*StackSize);
  if(S->base==NULL)
    exit(1);
  S->top=S->base;
  S->stacksize=StackSize;
}

程序不用看多少就有一个很严重的错误  指针不分配内存就拿过来直接用  觉得不会有错吗?
这样的程序跑起来会报内存错误的  你的没有暴露出来 只能说是开始的一时“幸运”吧

但后来在用的时候就会以一种 莫名奇妙的错误呈现 这样子使得错误隐藏的跟深点 没有试过几次这样的子的遭遇 一下子是很难看出来的 因为报错误的地方可能根本没有错
#14
守望之殇2011-04-04 18:51
回复 13楼 寒风中的细雨
是我的想法错了,之前没有认真看,后来我去验证了~~
如果我是在main函数中给SeqStack *S;进行内存分配也是可以的了?
但是还有一个疑问
 S = (SeqStack *) malloc (sizeof(SeqStack));
 S->base = (ElemType *)malloc(sizeof(ElemType)*StackSize);
当给结构体指针变量分配内存的时候究竟是对什么分配内存?
而且既然执行 S->base = (ElemType *)malloc(sizeof(ElemType)*StackSize);
是不是意味着给base分配内存,但是接下来怎么没有给top分配内存,
而就可以直接执行S->top = S->base;?
谢谢指教~~
#15
寒风中的细雨2011-04-05 09:38
如果我是在main函数中给SeqStack *S;进行内存分配也是可以的了?
    可以   只要是在自己使用之前分配了就可以 并没有限制 main中 还是其他的 过程当中  因为malloc出来的内存是在堆区  而非 栈区

当给结构体指针变量分配内存的时候究竟是对什么分配内存?
例如 像这样SeqStack *S;
定义了一个SeqStack 指针类型的变量    首先定义变量后 是会分配存储变量的内存 但是这时候的空间是为了存放指针的 而不会去分配指针所要指向的单元(SeqStack)
而这句 S = (SeqStack *) malloc (sizeof(SeqStack)); 就相当是实例化一样  成功后才可以去使用它。 来个很简单的解释:如果定义了一个整形变量 int i_var; 当然不是全局变量(因为全局默认初始化是0), 显然这时候i_var的值的内容是不确定的, 然后在来个输出 printf("\t%d\n", i_var); 这样子肯定是有问题的因为你没有对它赋值。

而且既然执行 S->base = (ElemType *)malloc(sizeof(ElemType)*StackSize);
是不是意味着给base分配内存,但是接下来怎么没有给top分配内存,
而就可以直接执行S->top = S->base;?
说白了 分配内存就要让指针不但有地方可指而且还要按照自己的要求去指 S->base = (ElemType *)malloc(sizeof(ElemType)*StackSize); 分配了一段内存让S->base指向开始位置 同样也可以让其他的指针指向这个位置 因为内存分配后只要不释放它总是在那的(当然程序还在跑)  S->top = S->base; 就是要这两个指针指向同一个位置  来实现运算目的的  来个简单的解释: 定义了两个整形变量 int i_var1, i_var2; 给第一个变量赋值为5 i_var1 = 5; 这时候难道不可以让地二个变量的值也为5吗  显然是可以做到的 i_var2 = i_var1; 结果i_var2同样也是5。  这里的5 你可以看做是地址{0x00000005}   int 可以看做是 ElemType * 。   



#16
守望之殇2011-04-07 20:44
回复 15楼 寒风中的细雨
今天终于想通了,谢谢帮助
#17
寒风中的细雨2011-04-08 06:51
回复 16楼 守望之殇
有收获就好
#18
ST默文2011-04-11 23:56
我看了你的存储结构定义。是一个顺序存储的栈。在你的函数int GetTop(SeqStack S,ElemType *x)
{
  if(EmptyStack(S)==1)
    return -1;
  *x=*S.top-1;

  return 1;
}
中就有错误啊
*x=*(S.top-1);
下面的还没看完,今天电脑没电了。希望能帮到你。
1