提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
链栈的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);但在空间上,顺序栈需要事先定义好一个固定的空间,这里可能存在一定的内存空间的浪费;而链栈则在空间上的长度可以无限制,只要你的内存够大!由于链栈的每个节点都需要多存储一个指针域的数据,所以,链栈增加了一定的内存开销。