线性结构栈之链表实现

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

//结点数据类型

typedef struct Node

{

int data;

struct Node *next;

}NODE,*PNODE;

//栈数据类型

typedef struct

{

PNODE top;

int cnt;

}Stack;

//想想看,为什么栈的数据结构是这样,我是这样思考的,如果你不这样写可以,

//那你必须造出一个计数的结点和链表头指针,计数变量可能是全局变量,这样数据过于离散,不利于组织和管理,我们将他们封装起来,利于维护

//也体现出了和面向对象封装的思想的相似性,当然这里不是面向对象了。

void initStack(Stack *);

void pushStack(Stack *,int);

void popStack(Stack *,int *);

bool stackEmpty(Stack *);

bool stackFull(Stack *,int *);

void main()

{

Stack stack;

//初始化栈

initStack(&stack);

//压栈

printf("开始压栈\n");

pushStack(&stack,2);

pushStack(&stack,3);

pushStack(&stack,4);

//出栈

printf("开始出栈\n");

int val;

popStack(&stack,&val);

popStack(&stack,&val);

popStack(&stack,&val);

}

void initStack(Stack *stack)

{

stack=(Stack *)malloc(sizeof(Stack));

if(NULL==stack)

{

printf("内存分配失败");

exit(-1);

}

stack->cnt=0;

stack->top=NULL    //这个地方有争议,到底指向一块内存,还是空,就看你是如何看待这个栈了。

}

void pushStack(Stack *stack,int val)

{

PNODE pnew=(PNODE)malloc(sizeof(NODE));

if(pnew==NULL)

{

printf("内存分配失败");

exit(-1);

}

//结点初始化

pnew->data=val;

pnew->next=NULL;

//开始压栈操作

//将栈top指针做为,新结点的后继,然后让新结点再次成为头指针。

pnew->next=stack->top;

stack->top=pnew;

stack->cnt++;

}

void popStack(Stack *stack,int *val)

{

if(stackEmpty(stack))

{

printf("栈已空,无法再出栈");

return;

}

*val=stack->top->data;

PNODE q=stack->top;

stack->top=stack->top->next;

stack->cnt--;

printf("%d  ",*val);

free(q);

printf("\n");

}

bool stackEmpty(Stack *stack)

{

if(stack->cnt==0)

return true;

else

return false;

}

时间: 2024-07-29 11:43:27

线性结构栈之链表实现的相关文章

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

数据结构和算法-数据结构-线性结构-顺序表 链表和哈希表

####################################################### """ # 线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础. # 根据线性表的实际存储方式,分为两种实现模型: # 顺序表, # 链表, # 下面分别进行研究, """ ####################################################### &qu

线性结构-数组和链表的实现

连续存储(数组) 1.什么叫数组? 元素的类型相同,大小相等. 2.优缺点? 查询速度快,增加删除慢 #include <stdio.h> #include <malloc.h> #include <stdlib.h> //定义一个数据类型,名字 Arr,成员分别 struct Arr { int * pBase; //存储的是数组第一个元素的地址 int len; //数组的长度 int cnt; //当前数组有效元素的个数 int increment; //自动增长

线性结构之双链表实现

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node * prior; struct node * next; }NODE,*PNODE; PNODE createList(PNODE); void travelList(PNODE); void insertList(PNODE,int,int); int lengthLis

线性结构——栈

//函数声明: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define STACK_INIT_MEMORY 100 #define STACK_GROW_MEMORY 10 typedef int ElemType; typedef struct stack { ElemType *esp; ElemType *ebp; int size;                     

线性结构——栈和队列

栈类 1 public class MyStack<T> { 2 //栈的大小 3 private int size; 4 //存放栈的数组 5 private Object[] data; 6 7 /** 8 * 无参构造方法,初始化数组大小 9 */ 10 public MyStack() { 11 size = -1; 12 data = new Object[10]; 13 } 14 15 /** 16 * 有参构造方法,自定义数组大小 17 */ 18 public MyStack(

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

2、线性结构——数据结构【基础篇】

线性结构 线性结构的4大特点: 1.有一个结点只有前驱 2.有一个结点只有后继 3.其他结点既有一个前驱也有一个后继 4.在逻辑上相邻在物理上也相邻数据的逻辑关系叫做线性结构 线性结构的3大类型: 1.线性表--线性表是n个数据元素的有限序列 存储结构: 顺序存储对应一组操作:顺序表 链式存储对应一组操作:单向链表.双向链表.循环链表 2.栈--限定只在表的一端(表尾)进行插入和删除操作的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),其这一端被固定了. 存储结构