//链式栈的结构
typedef struct Node //栈的结点结构
{
int data;
struct Node *next;
}Node,*PNode;
typedef struct LinkStack //栈的结构
{
PNode top; //栈顶
int count;
}LinkStack;
//栈初始化
bool InitStack(LinkStack *S)
{
S->top = (PNode)malloc(sizeof(Node));
if(!S->top) //有无可分配的内存
return false;
S->top=NULL;
S->count=0;
return true;
}
//入栈
LinkStack* push( LinkStack * stack,int n )
{
PNode s;
s=(PNode)malloc(sizeof(Node));
s->data=n;
s->next=stack->top;
stack->top=s;
stack->count++;
return stack;
}
//出栈
bool pop( LinkStack *stack,int & n )
{
if( stack->count==0 )
return false;
n=stack->top->data;
PNode s=stack->top;
stack->top=s->next;
free(s);
stack->count--;
return true;
}
//完整代码
//栈的链式存储
#include <cstdlib>
#include <cstdio>
typedef struct Node //栈的结点结构
{
int data;
struct Node *next;
}Node,*PNode;
typedef struct LinkStack //栈的结构
{
PNode top; //栈顶
int count;
}LinkStack;
bool InitStack(LinkStack *S)
{
S->top = (PNode)malloc(sizeof(Node));
if(!S->top) //有无可分配的内存
return false;
S->top=NULL;
S->count=0;
return true;
}
LinkStack* push( LinkStack * stack,int n )
{
PNode s;
s=(PNode)malloc(sizeof(Node));
s->data=n;
s->next=stack->top;
stack->top=s;
stack->count++;
return stack;
}
bool pop( LinkStack *stack,int & n )
{
if( stack->count==0 )
return false;
n=stack->top->data;
PNode s=stack->top;
stack->top=s->next;
free(s);
stack->count--;
return true;
}
int main()
{
LinkStack stack; //栈必须初始化
int i=10;
if(InitStack(&stack))
while( i-- )
push(&stack,i);
int t=0;
while( stack.count ){
if(pop(&stack,t))
printf( "%d pop\n",t );
}
return 0;
}
1、初始化栈的时候必须注意的一点
LinkStack s2; //首先定义一个栈的结构变量s2
printf("%d\n",&s2);
s2.top=NULL;
s2.count=0;
上面这种初始化方式,没有问题,LinkStack s2; 已经给s2分配空间,但是没有初始化s2.top,所以只对s2的变量top和count初始化就行。
LinkStack *s1; //首先定义一个栈的指针变量s1
s1=NULL;
s1->top=NULL;//ERROR
s1->count=0;
一开始,我是用s1的定义方式,一直报错,原因是 只是初始化了一个指针变量,计算机**只是分配了存储地址的内存,但是并没有分配*用来存储指针所指向的数据*的内存**,所以上面的程序,s1->top—=NULL 就会出错
这个问题如同
int *s;
*s=100;//ERROR!
所以在使用指针的时候必须要小心这一点!必须要对指针解除引用运算符(*)或使用指向结构体成员运算符(->)之前,将它初始化为一个确定的适当的地址。
2、链式结构的构成
typedef struct Node //栈的结点结构
{
int data;
struct Node *next;
}Node,*PNode;
typedef struct LinkStack //栈的结构
{
PNode top; //栈顶
int count;
}LinkStack;
我的理解,LinkStack 是申请一块内存,里面放 栈的top指针 ( 其中,top是指向栈结点的指针结构) 和 count (对栈中的元素个数进行计数的)。其实,这里,LinkStack的结构可以根据自己的需要进行调整,比如,
typedef struct LinkStack //栈的结构
{
PNode top;//栈顶
PNode bottom; //栈底
int count;
}LinkStack;
而这块内存一但初始化之后,就一直是它,进栈 出栈等操作只是针对里面的top和count发生变化,对他的地址,他的大小都没有影响,从下面可以看出:
LinkStack s2;
printf("%d\n",&s2);
s2.top=NULL;
s2.count=0;
push(&s2,3);
printf("%d\n",&s2);
push(&s2,4);
printf("%d\n",&s2);
int t1=0;pop(&s2,t1);
printf("%d\n",&s2);
输出
3602216
3602216
3602216
3602216