设为首页 加入收藏

TOP

栈链的C语言实现
2014-11-24 03:11:42 来源: 作者: 【 】 浏览:1
Tags:语言 实现

出栈与入栈是栈的最主要操作,当无法预见栈所需大小时,需要采用栈链的方式。


一、栈链结点


在栈链中,不需要像单链表一样需要头结点。栈链的结构如下图所示


栈链


根据该结构,用C语言定义为:


typedef char SElemType


typedef struct StackNode


{


SElemType data;//根据实际需要定义数据类型


struct StackNode *next;


}StackNode,*LinkStackPtr;


typedef struct LinkStack


{


LinkStackPtr top;//指向栈链顶部


int count;//用以判断是否栈为空,可初始化为0


}LinkStack;


二、进栈操作


能够进栈的前提是已成功建立栈空间,即成功调用malloc函数。进栈操作的过程如下图所示。进栈函数所需的参数主要是指向栈顶的指针和入栈内容,因此可定义为:


int Push(LinkStack *pS,SElemType e)


进栈操作


Step1:开辟内存,将需要入栈的元素压入栈:


LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));


s->data = e;


Step2:更改指针


(1)新结点的*next指向原来栈顶:s->next = pS->top;


(2)栈链新的top指针指向新建立的结点:pS->top = s;


Step3:更改栈状态(累计入栈元素个数)


pS->count++;


三、出栈操作


出栈之前需要判断当前栈的状态,如果栈元素个数为零,则显然是空栈,无法进行出栈操作。出栈操作函数同样需要两个参数,一是指向栈链的指针,二是弹出的栈元素,因此定义为:


int Pop(LinkStackPtr *pS,SElemType *e)//之所以是*e,是为了在函数结束后可以取得该弹出元素


出栈操作过程如下图所示:


出栈


出栈过程:


Step1:获取弹出元素:*e = pS->top->data;


Step2:top指针指向栈顶:p = pS->top ;pS->top = p->next;//LinkStackPtr p;


Step3:释放结点:free(p);


Step4:更改栈状态


pS->count--;


四、测试程序


#include
#include


typedef char SElemType ;


typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;


typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;


//栈指针初始化
void InitialStack(LinkStack *L)
{
L->top=NULL;
L->count=0;
return;
}
//栈状态
int StackEmpty(LinkStack *pS)
{
if(!pS->count)//若为空,则返回1
return 1;
else
return 0;//若非空,则返回0;
}
//压栈操作
int Push(LinkStack *pS,SElemType e)
{
//一般情况下,不存在栈满情况
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = pS->top;


pS->top=s;
pS->count++;
return 0;
}


//出栈操作
int Pop(LinkStack *pS,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(pS))
{
printf("栈为空!");
return 0;
}


*e=pS->top->data;


p = pS->top;
pS->top = p->next;
free(p);
pS->count--;
return 0;
}
//打印栈链
void PrintStackLink(LinkStack *pS)
{
LinkStackPtr L;
int i;
//i = pS->count;
L = pS->top;
if(pS->count == 0)
{
printf("栈为空!");
return;


}
for(i=0;i<(pS->count);i++)
{
printf("%c\n",L->data);
L = L->next;
}
return ;
}
void main()
{
//测试
char getch;
char outch;
LinkStack myStack;
InitialStack(&myStack);
//压栈
printf("请输入压入栈的数据(char型),输入#结束");
scanf("%c",&getch);
while(getch!='#')
{
Push(&myStack,getch);
scanf("%c",&getch);
}
printf("栈链内容为:\n");
PrintStackLink(&myStack);


//出栈
while(!StackEmpty(&myStack))
{
Pop(&myStack,&outch);
printf("弹出内容为:%c\n",outch);
}
PrintStackLink(&myStack);
while(1);
return ;
}


相关阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉树递归实现与二重指针 下一篇10个Objective-C基础面试题,iOS..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)