用C语言模拟堆栈

q_v_i_t 2002-07-09 04:06:02
请大家看一下下面的程序,帮我解决一个问题:
#define STACK_INIT_SIZE 5
#define STATCK_INCREMENT 5
#include <stdio.h>
struct stack
{ int *base;
int *top;
int stacksize;
};

void initstack(struct stack *s_init);
int push(struct stack *s_push,int e_push);
int pop(struct stack *s_pop,int e_pop);
main()
{ struct stack *st; //struct stack st;
int i,e;
initstack(st); //initstack(&st);
printf("\ninput:\n");
for(i=0;i<st->stacksize;i++) //for(i=0;i<st.stacksize;i++)
{ scanf("%d",&e);
push(st,e); //push(&st,e);
}
printf("\noutput\n");
for(i=0;i<st->stacksize;i++) //for(i=0;i<st.stacksize;i++)
printf("%d",pop(st,e)); //printf("%d",pop(&st,e));
}

void initstack(struct stack *s_init)
{ s_init->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
s_init->top=s_init->base;
s_init->stacksize=STACK_INIT_SIZE;
}

int push(struct stack *s_push,int e_push)
{ if(s_push->top==s_push->base+s_push->stacksize)
{ printf("overflow!");
return(0);
}
*s_push->top=e_push;
s_push->top++;
return(1);
}

int pop(struct stack *s_pop,int e_pop)
{ if(s_pop->top==s_pop->base)
{ printf("stack empty");
return(0);
}
s_pop->top--;
e_pop=*s_pop->top;
return(e_pop);
}

请问为什么定义成指针类型就不行,而定义成变量就可以。
请指出如何才能用指针????
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊主任 2002-07-10
  • 打赏
  • 举报
回复
再补充一句,定义指针类型和定义变量类型是有区别的。比如stack st,这时st就是1个变量,定义后系统给他分配了一块内存空间。而定义指针stack *st,这时系统只知道有这么一个指针st是指向stack型变量的,但是具体指向那个变量系统不知到,需要你做初始化。
你用sizeof()就可以看出定义指针和变量的区别了。
熊主任 2002-07-10
  • 打赏
  • 举报
回复
谁说st = NULL是初始化?st = NULL只是让它为空指针,不让它乱说乱动,但是你要用这个指针,总得给它分配一个对象,还有new stack是c++的语法,在c里还是应该用malloc初始化st对象给它分配内存。
所以你在调用initstack(st)之前应该加一句:
st = (struct stack*)malloc(sizeof(stack));
alula 2002-07-10
  • 打赏
  • 举报
回复
<Thinking in C++>贯穿整本书的stack例子很好啊,为什么不用C++写呢?
q_v_i_t 2002-07-09
  • 打赏
  • 举报
回复
对,我知道是没分配内存的原因,可你写的new stack是什么意思了???
我的st=NULL就是初始化呀
codingcoding 2002-07-09
  • 打赏
  • 举报
回复
struct stack *st
根本就没有分配内存就使用了。所以出错了

struct stack *st = new stack;

在最后
delete st;
q_v_i_t 2002-07-09
  • 打赏
  • 举报
回复
我加了一个初始化的语句(st=NULL;),warning就没有了,可是运行结果变成了下面这样,原因是什么了??
input:
1
2
3
4
5

output
54321Null pointer assignment
sungolf 2002-07-09
  • 打赏
  • 举报
回复
在VC6下编译可以。我刚试试过,用指针的话输出很正常啊。
(使用malloc 要加上#include <stdlib.h>)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧