回 帖 发 新 帖 刷新版面

主题:[讨论]大哥大姐们,帮个忙啊!急急

#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int ElemType;

typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
}SqStack, *LinkStack;


/*构造一个空栈*/
Status initstack(LinkStack s)
{
    int i;
    s->base = (ElemType *) malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!s->base) return OVERFLOW;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}

/*入栈*/
Status push(LinkStack s,ElemType x)
{
    if (s->top - s->base > s->stacksize)
    {
      s->base = (ElemType *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(ElemType));
      if (!s->base) exit(OVERFLOW);
      s->top = s->base + s->stacksize;
      s->stacksize += STACKINCREMENT;
    }
    *s->top++ = x;
    return OK;
}

/*出栈*/
Status pop(LinkStack s,ElemType *x)
{
    if (s->top == s->base) return ERROR;
    else  *x = *(--s->top);
    return OK;
}


/*栈的遍历*/
void traverse(LinkStack s)
 {  ElemType *p=s->top;
    if(s->top==s->base)
    printf("栈空");
    else
    while(s->top!=s->base)
    { s->top=s->top-1;
      printf("%5d",*s->top);}
      printf("\n");
    s->top=p;
 }


void main(){
    SqStack *s;
    ElemType e,*x;
    int length,i,data;
    int select;
    do{
       printf("1 建立一个空栈\n");
       printf("2 元素入栈\n");
       printf("3 元素出栈\n");
       printf("0 退出,请输入选项(0-3)\n");
       scanf("%d",&select);
       switch(select){
       case(0): break;
       case(1): initstack(s);
                printf("输入表长:");
                scanf("%d",&length);
                printf("\n输入数据:");
                for(i=0;i<length;i++)
                {  scanf("%d",&data);
                   push(s,data);}
                traverse(s);
                break;

       case(2): printf("输入元素的值:");
                scanf("%d",&e);
                push(s,e);
                traverse(s);
                break;

       case(3): printf("%d\n",pop(s,*x));
                traverse(s);
                break;
       default:
              printf("输入选项有错误,请重新输入!\n");
              }
                    }while(select);
       getch();
       } 
帮我看看这个程序哪错了,为什么弹出的栈顶元素总是1啊[em10]

回复列表 (共3个回复)

沙发

这样的结构:
typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
}SqStack, *LinkStack;
是不可能弄出一个栈来的,因为它连指针域都没有!你如何把结点连结起来?
看看书吧!

板凳

1楼说的不对,楼主建的不是链栈,而是顺序栈,不用指针域(next)的。

To楼主:我没有很仔细的看,但起码这里是有毛病的
   case(3): printf("%d\n",pop(s,*x));
                traverse(s);
                break;
这里输出的肯定总是1,因为pop函数返回的值是1或0,只要栈里有元素就返回1。我想你要输出的是X的值,所以应该改为:
case(3):        pop(s,x);
                printf("%d\n",*x);
                traverse(s);
                break;

3 楼

/*入栈*/
Status push(LinkStack s,ElemType x)
{
    if (s->top - s->base > s->stacksize)        //这里判定要用大于等于
    {
      s->base = (ElemType *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(ElemType));
      if (!s->base) exit(OVERFLOW);
      s->top = s->base + s->stacksize;
      s->stacksize += STACKINCREMENT;
    }
    *s->top++ = x;
    return OK;
}

case(3): printf("%d\n",pop(s,*x)); //指针实参 不要星号
                traverse(s);
                break;

我来回复

您尚未登录,请登录后再回复。点此登录或注册