链栈的C实现python实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、链栈是什么?

链栈即栈的链式存储结构的简称。

二、C语言实现

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int status;
typedef int SElemType;
typedef struct stackNode{
	SElemType data;
	struct stackNode *next;
}stackNode, *LinkStackPtr;

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

status Push(LinkStack *s, SElemType e){
	//生成一个数据域为e的节点
	LinkStackPtr S = (LinkStackPtr)malloc(sizeof(stackNode));
	S->data = e;
	//让新节点的指针域指向链栈的栈顶指针 
	S->next = s->top;
	//栈顶指针指向新的节点 
	s->top = S;
	//链栈长度加1 
	s->count++;
	return OK;
}

status Pop(LinkStack *s, SElemType *e){
	LinkStackPtr p;
	if (s->top == NULL){
		return ERROR;//链栈为空
	} 
	*e = s->top->data;
	p = s->top; 
	s->top = s->top->next;
	free(p); 
	s->count--;
	return OK;
}
//验证 
int main(int argc, char const *argv[]){
	stackNode n = {1, NULL};
	LinkStack s = {&n, 1};
	printf("向链栈中插入2,20,200三个数据元素\n");
	Push(&s, 2);
	Push(&s, 20);
	Push(&s, 200);
	printf("链栈中插入2,20,200三个数据元素完毕\n");
	printf("链栈的长度为%d\n", s.count); 
	printf("链栈中的数据元素为:");
	int e;//用于接收Pop的数据元素 
	int i=0;
	int stackLength = s.count;
	for(i;i<stackLength;i++){
		Pop(&s, &e);
		printf("%d ", e);
	}
	printf("\n");
	return 0;
}
 

##运行结果
在这里插入图片描述

三、python实现

# -*-coding:utf-8-*-


class StackNode:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next


class LinkStack:
    def __init__(self):
        self.top = StackNode()
        self.length = 0

    def push(self, item):
        node = StackNode(item, self.top)
        self.top = node
        self.length += 1

    def pop(self):
        if self.top.data is None:
            return "LinkStack is None."
        e = self.top.data
        self.top = self.top.next
        self.length -= 1
        return e

    def LinkStackLen(self):
        return self.length


if __name__ == '__main__':
    s = LinkStack()
    print("链栈的长度为%d" % s.LinkStackLen())
    s.push(1)
    s.push(10)
    s.push(11)
    s.push(99)
    print("链栈的长度为%d" % s.LinkStackLen())
    print("打印链栈的元素")
    for i in range(s.LinkStackLen()):
        print("%d" % s.pop(), end=" ")
    print()

##运行结果
在这里插入图片描述

四、总结

链栈相对于顺序栈来说,时间复杂度均为O(1);但在空间上,顺序栈需要事先定义好一个固定的空间,这里可能存在一定的内存空间的浪费;而链栈则在空间上的长度可以无限制,只要你的内存够大!由于链栈的每个节点都需要多存储一个指针域的数据,所以,链栈增加了一定的内存开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你抱着的是只熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值