2016年7月23日15:39:13
为什么需要链式栈?
这是因为,顺序栈的使用需要事先指定存贮空间的大小,如果静态分配的存贮空间分配的过大,使得内存空间浪费,
而事先指定的存贮空间分配的过小,会使得,在程序运行时可能会发生存贮空间不够的情形,这就产生了栈的链式
存贮结构.
什么时候适合使用链式栈?
当数据元素的数目变化较大时,或者数据元素的数目事先不确定时,适合使用栈的链式存贮结构;
什么是链式栈?
栈的链式存贮结构是用一组不连续的存贮空间来存放栈中的数据元素的存贮结构;
链式栈为什么一般不用定义头结点?
栈是一种操作受限的线性表,这是因为栈本身是一种线性表,但是只能在表头进行插入和删除操作,
那么链式栈就是只能在链表的头部进行插入和删除操作,那么既然就已经确定操作的位置了,就不在
需要头结点了,在链表中定义头结点的目的是:定义头结点是为了方便和统一链表插入和删除的操作,使得第一个
节点的插入和删除操作和中间节点的插入和删除操作统一.
链式栈的栈顶指针如何表示?
链表的必须参数是头指针,而栈的必须参数是栈顶指针,于是我们可以把链表的头指针当做栈的栈顶指针来使用.
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node
{
DataType stack;
struct node * pNext;
}linkList;
typedef struct stack
{
linkList * pTop;
linkList * pBottom;
}linkStack;
void initLinkStick(linkStack * S);
int isEmpty(linkStack * S);
int pushLinkStick(linkStack * S,DataType element);
int popLinkStick(linkStack * S,DataType * element);
int getTop(linkStack * S, DataType * element);
int getLength(linkStack * S);
void destroyLinkStick(linkStack * S);
void initLinkStick(linkStack * S)
{
S->pTop = (linkList * )malloc(sizeof(linkList));
if(!S->pTop)
{
printf("动态内存分配失败!\n");
exit(-1);
}
S->pBottom = S->pTop;
S->pBottom->pNext = NULL;
return ;
}
int isEmpty(linkStack * S)
{
if(S->pBottom == S->pTop)
return 1;
else
return 0;
}
int pushLinkStick(linkStack * S,DataType element)
{
linkList * pNew;
pNew = (linkList * )malloc(sizeof(linkList));
if(NULL == pNew )
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->stack = element;
pNew->pNext = S->pTop;
S->pTop = pNew;
return 1;
}
int popLinkStick(linkStack * S,DataType * element)
{
linkList * pFree;
if( isEmpty(S) )
{
printf("栈为空,无法继续出栈");
return 0;
}
pFree = S->pTop;
*element = pFree->stack;
S->pTop = S->pTop->pNext;
free(pFree);
return 1;
}
int getTop(linkStack * S, DataType * element)
{
if(isEmpty(S))
return 0;
*element = S->pTop->stack;
return 1;
}
int getLength(linkStack * S)
{
int i = 0;
linkList * pCur;
pCur = S->pTop;
while( pCur )
{
pCur = pCur->pNext;
i++;
}
return i;
}
void destroyLinkStick(linkStack * S)
{
while(S->pTop)
{
S->pBottom = S->pTop->pNext;
free(S->pTop);
S->pTop = S->pBottom;
}
return;
}
int main(void)
{
linkStack S;
DataType element;
initLinkStick(&S);
return 0;
}