赞
踩
链栈--单链表实现栈
链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出
直接在链表表头进行操作,链表表头相当于栈顶
入栈:头插。 出栈:删除首元结点
定义链栈:.
以定义单链表的方式来定义链栈
即一个数据域
一个指针域
其中listack==sstack *
使用 listack 声明链栈中的结点指针,意在强调操作对象是栈;
使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点
- typedef struct listackNode{//链栈结点
- int date;//链栈结点中元素
- struct listackNode* next;//指针
- }sstack,*listack;
初始化栈:
先创建一个栈s并且动态内存分配一块空间
再让头结点指向NULL
再返回s的地址
- listack initstack()
- {
- listack s=(listack)malloc(sizeof(sstack));
- s->next=NULL;
- return s;
- }
入栈函数:
链表结点个数可以动态调节,无需判满
先创建一个p结点
再将数据写入结点
之后再以单链表的形式进行头插
- void Pushh(listack s,int k)
- {
- //链表结点个数可以动态调整,无需判满
- //头插法插入结点,实现入栈
- sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点
- p->date =k;
- //头插法 插入p
- p->next =s->next;
- s->next =p;
出栈函数:
先判空
如果不为空则让p结点指向待删的首元结点
再让头结点指向p结点的下一个结点
p指向NULL
再free掉p结点
- void Popp(listack s)
- {
- //删除之前判空,还有没有的删
- if(s->next==NULL)
- {
- printf("栈空\n");//栈空报错,不能删除
- }
- else
- {
- sstack *p=s->next ;//让p指向待删除的首元结点
-
- s->next =p->next ;
-
- p->NULL;
-
- free(p);
- }
- }

读取栈顶元素:
先判定是否为栈空
如果不为空则
将首元结点的数据赋值给x
再打印出x
- //读取栈顶元素
- void gettop(listack s)
- {
- int x;
- //判空,还有没有的读取
- if(s->next==NULL)
- {
- printf("栈空\n");//栈空报错,不能删除
- }
- else
- {
- x=s->next->date;
- printf("%d\n",x);
- }
-
- }
- in

总代码:
- #include<stdio.h>
- #include<stdlib.h>
- ///链栈--单链表实现栈///
- typedef struct listackNode{//链栈结点
- int date;//链栈结点中元素
- struct listackNode* next;//指针
- }sstack,*listack;
- //此处的listack与链表代码中的 linklist类似
- //listack==sstack *;
- //使用 listack 声明链栈中的结点指针,意在强调操作对象是栈;
- //使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点
-
-
- //链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出
- //直接在链表表头进行操作,链表表头相当于栈顶
- //入栈:头插。 出栈:删除首元结点
-
- //---------------------------------------------------------------------
- //栈操作:初始化,判空,入栈(push),出栈(pop),读取栈顶元素(top)
- //以顺序栈为例子
- //初始化
- listack initstack()
- {
- listack s=(listack)malloc(sizeof(sstack));
- s->next=NULL;
- return s;
- }
-
- //入栈--对栈进行了修改,指针传递
- void Pushh(listack s,int k)
- {
- //链表结点个数可以动态调整,无需判满
- //头插法插入结点,实现入栈
- sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点
- p->date =k;
- //头插法 插入p
- p->next =s->next;
- s->next =p;
-
- }
- //出栈
- void Popp(listack s)
- {
- //删除之前判空,还有没有的删
- if(s->next==NULL)
- {
- printf("栈空\n");//栈空报错,不能删除
- }
- else
- {
- sstack *p=s->next ;//让p指向待删除的首元结点
-
- s->next =p->next ;
- free(p);
- }
- }
- //读取栈顶元素
- void gettop(listack s)
- {
- int x;
- //判空,还有没有的读取
- if(s->next==NULL)
- {
- printf("栈空\n");//栈空报错,不能删除
- }
- else
- {
- x=s->next->date;
- printf("%d\n",x);
- }
-
- }
- int main()
- {
- int x;
- listack s=initstack();
- Pushh(s,1);
- Pushh(s,2);
- Pushh(s,3);
- gettop(s);
-
- Popp(s);
- gettop(s);
- return 0;
- }
-
-
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。