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

栈的基本操作,请指点哪里出现错误。

chenxd 发布于 2015-11-26 20:57, 1949 次点击
各位大神,请看一下我的顺序栈的建立与输出到底哪出现错误,百思不得其解。我用的是DEV-C。
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

#define STACK_INIT_SIZE 100
typedef int SElemType;

 typedef struct {
    SElemType *base;
    SElemType *top;
    int StackSize;
}sqStack;

//创建栈
void InitialStack(sqStack *S)
{
    int a;
    S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S->base)
        printf("创建失败!\n");
    else
    {
        S->top = S->base;
        S->StackSize = STACK_INIT_SIZE;
        scanf("%d",&a);
        while(a!=-1&&((S->top )- (S->base )< (S->StackSize)))
        {
            *(S->top)=a;
            S->top++;
                     scanf("%d",&a);
        }
    }   
}
void StackPrintf(sqStack *S){
    SElemType *p;
    p=S->base;
    while(p!=S->top)
        {
        printf(" %d",*p);
        p++;}
}

int main(int argc, char *argv[]) {
   
    sqStack *S;
    printf("\n创建一个栈:\n");
    InitialStack(S);
    //输出栈
    StackPrintf(S);
    return 0;
}
3 回复
#2
hellovfp2015-11-27 10:31
出现啥错误啦?想先输出最后进栈的元素,后输出最早进栈的元素
你可以改成这样:
void StackPrintf(sqStack *S){
    SElemType *p;
    p=S->top;

    while(p--!=S->base)
        {
            printf(" %d",*p);
        }
}

你的程序有一个潜在的错误,
主程序中的sqStack *S;指针并未初始化,你就放到InitialStack调用。
*S就是一个大家通常说的野指针,S->base =.....这句,S都不知道指向何处,何来的->base?
#3
hellovfp2015-11-27 11:19
另外,从程序设计的角度上来说,最好把数据的输入从数据结构代码分离出来。
函数接口专注于干一件事,你可以将初始化栈操作放入init_stack()函数里。
将,压栈操作放入push_stack()函数里,出栈操作放入pop_stack()函数里。。
遍历操作放入foreach_stack(), 消毁栈操作放入destory_stack().....

init_stck()只做初始化,不干压栈的事。
push_stack()只做压栈的操作,不处理数据从控制台输入输出的事儿。
这样代码可以变得更清晰,调试起来也方便。
#4
chenxd2015-11-27 12:48
回复 2楼 hellovfp
谢谢!我在主程序中修改了一下,就可以了。
   sqStack stack,*S;
    S = &stack;
1