数据结构-栈的顺序存储和链式存储
2017-09-14 16:20
423 查看
栈的特点:先进后出
栈的顺序存储
stack.h
stack.c
maic.c
打印结果:
栈的链式存储
stack_link.h
stack_link.c
maic.c
打印结果
栈的顺序存储
stack.h
#pragma once #include<stdlib.h> #define MAXSIZE 1024 typedef struct STACK { void* data[MAXSIZE]; int size; }SStack; //初始化栈 void* Init_Stack(); //入栈 void PushStack(void* Stack,void* data); //出栈 void PopStack(void* Stack); //获取栈顶元素 void* TopStack(void* Stack); //获取大小 int GetSize(void* Stack); //销毁栈 void DestroyStack(void* Stack);
stack.c
#include"stack.h" //初始化栈 void* Init_Stack() { SStack* Stack = (SStack*)malloc(sizeof(SStack)); Stack->size = 0; int i = 0; for (i = 0; i < MAXSIZE; ++i) { Stack->data[i] = NULL; } return Stack; } //入栈 void PushStack(void* Stack, void* data) { if (NULL == Stack) { return; } if (NULL == data) { return; } SStack* sstack = (SStack*)Stack; //判断栈是否满了 if (sstack->size == MAXSIZE) { return; } sstack->data[sstack->size] = data; ++sstack->size; } //出栈 void PopStack(void* Stack) { if (NULL == Stack) { return; } SStack* sstack = (SStack*)Stack; sstack->size--; } //获取栈顶元素 void* TopStack(void* Stack) { if (NULL == Stack) { return; } SStack* sstack = (SStack*)Stack; return sstack->data[sstack->size-1]; } //获取大小 int GetSize(void* Stack) { if (NULL == Stack) { return; } SStack* sstack = (SStack*)Stack; return sstack->size; } //销毁栈 void DestroyStack(void* Stack) { if (NULL == Stack) { return; } free(Stack); }
maic.c
#include"stack.h" typedef struct PERSON { char name[64]; int age; }person; int main() { person p1 = { "aaa", 1 }; person p2 = { "bbb", 2 }; person p3 = { "ccc", 3 }; person p4 = { "ddd", 4 }; SStack* sstack = Init_Stack(); PushStack(sstack, &p1); PushStack(sstack, &p2); PushStack(sstack, &p3); PushStack(sstack, &p4); while (sstack->size > 0) { person*p = (person*)TopStack(sstack); printf("Name:%s,Age:%d\n", p->name, p->age); PopStack(sstack);//出栈,栈顶指针-1 } DestroyStack(sstack); getchar(); return 0; }
打印结果:
栈的链式存储
stack_link.h
#pragma once #include<stdlib.h> #include<stdio.h> //栈的特点是先进后出,用链式存储的话头查就实现了先进后出的特点 //栈节点 typedef struct STACKNODE { struct STACKNODE* next; }StackNode; typedef struct STACK { StackNode header; int size; }SStack; //初始化栈 void* Init_Stack(); //入栈 void PushStack(void* Stack, StackNode* data); //出栈 void PopStack(void* Stack); //获取栈顶元素 void* TopStack(void* Stack); //获取大小 int GetSize(void* Stack); //销毁栈 void DestroyStack(void* Stack);
stack_link.c
#include "stac 4000 k_link.h" //初始化栈 void* Init_Stack() { SStack* sstack = (SStack*)malloc(sizeof(SStack)); if (NULL == sstack) { return NULL; } sstack->header.next = NULL; sstack->size = 0; return sstack; } //入栈 void PushStack(void* Stack, StackNode* data) { if (NULL == Stack) { return; } if (NULL == data) { return; } SStack* sstack = (SStack*)Stack; data->next = sstack->header.next;//把数据空间的前4个字节串起来,形成链表 sstack->header.next = data; ++sstack->size; } //出栈 void PopStack(void* Stack) { if (Stack == NULL) { return; } SStack* sstack = (SStack*)Stack; if (sstack->size == 0) { return; } //让头指向第二个节点就行了 StackNode* pFirst = sstack->header.next; sstack->header.next = pFirst->next;//头节点指向第二个节点 --sstack->size; } //获取栈顶元素 void* TopStack(void* Stack) { if (Stack == NULL) { return NULL; } SStack* sstack = (SStack*)Stack; return sstack->header.next; } //获取大小 int GetSize(void* Stack) { if (Stack == NULL) { return -1; } SStack* sstack = (SStack*)Stack; return sstack->size; } //销毁栈 void DestroyStack(void* Stack) { if (Stack == NULL) { return; } free(Stack); }
maic.c
#define _CRT_SECURE_NO_WARNINGS #include "stack_link.h" #include<stdio.h> #include<string.h> typedef struct STUDENT { StackNode node; char name[64]; int age; }student; int main() { SStack* Stack = Init_Stack(); student s1, s2, s3, s4, s5; strcpy(s1.name, "aaa"); strcpy(s2.name, "bbb"); strcpy(s3.name, "ccc"); strcpy(s4.name, "ddd"); strcpy(s5.name, "eee"); s1.age = 1; s2.age = 2; s3.age = 3; s4.age = 4; s5.age = 5; PushStack(Stack, (StackNode*)&s1); PushStack(Stack, (StackNode*)&s2); PushStack(Stack, (StackNode*)&s3); PushStack(Stack, (StackNode*)&s4); PushStack(Stack, (StackNode*)&s5); while (Stack->size > 0) { student* s = (student*)TopStack(Stack); printf("Name:%s,Age:%d\n", s->name, s->age); PopStack(Stack); } DestroyStack(Stack); getchar(); return 0; }
打印结果
相关文章推荐
- 数据结构第六章-二叉树顺序存储变链式存储
- 数据结构存储的顺序和链式对比
- 队列的顺序存储和链式表示方法-数据结构学习笔记2.3
- 数据结构_线性表_顺序/链式存储优缺点比较
- C语言数据结构-3.栈的顺序及链式存储结构
- 数据结构-队列-顺序链式存储
- 数据结构-【栈】的链式存储和顺序存储
- 数据结构33:二叉树顺序存储和链式存储
- 数据结构存储的顺序和链式对比
- 数据结构存储的顺序和链式对比
- 数据结构 链式-顺序存储
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- 数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例
- 数据结构存储,顺序和链式比较d
- 数据结构 串(链式存储)的基本操作
- 数据结构:二叉树的链式存储实现
- 数据结构:线性表(顺序存储)顺序栈类(实现创建,输出,入栈出栈,读栈顶元素功能)
- 栈的顺序存储和链式存储
- 线性表的顺序存储和链式存储
- 数据结构一一线性表的链式存储结构之头插法和尾插法建立链表