数据结构(二)---栈:
2015-06-10 14:45
344 查看
数据结构(二)---栈:
①栈的定义及实现:
栈是一种特殊的线性表、栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端
栈底(Bottom):不允许操作的一端
②栈的性质:
性质:后进先出(LIFO)③栈的操作:
栈的一些常用操作:创建栈、销毁栈、清空栈、进栈、出栈、获取栈顶元素、获取栈的大小栈是一种特殊的线性表
栈只允许在线性表的一端进行操作
栈通常有两种实现方式:顺序结构实现、链式结构实现
下面通过一个实例进行说明:
stack.h:
#ifndef Stack_H #define Stack_H typedef int Item; typedef struct node * PNode; typedef struct node { Item data; PNode down; }Node; typedef struct stack { PNode top; int size; }Stack; Stack *InitStack(); void DestroyStack(Stack *ps); void ClearStack(Stack *ps); int IsEmpty(Stack *ps); int GetSize(Stack *ps); PNode GetTop(Stack *ps, Item *pitem); PNode Push(Stack *ps, Item item); PNode Pop(Stack *ps, Item *pitem); void StackTraverse(Stack *ps, void(*visit)()); #endif
stack.c:
#include"Stack.h" #include<malloc.h> #include<stdlib.h> Stack *InitStack() { Stack *ps = (Stack *)malloc(sizeof(Stack)); if (ps != NULL) { ps->top = NULL; ps->size = 0; } return ps; } int IsEmpty(Stack *ps) { if (ps->top == NULL && ps->size == 0) return 1; else return 0; } int GetSize(Stack *ps) { return ps->size; } PNode Push(Stack *ps, Item item) { PNode pnode = (PNode)malloc(sizeof(Node)); if (pnode != NULL) { pnode->data = item; pnode->down = GetTop(ps, NULL); ps->size++; ps->top = pnode; } return pnode; } PNode GetTop(Stack *ps, Item *pitem) { if (IsEmpty(ps) != 1 && pitem != NULL) { *pitem = ps->top->data; } return ps->top; } PNode Pop(Stack *ps, Item *pitem) { PNode p = ps->top; if (IsEmpty(ps) != 1 && p != NULL) { if (pitem != NULL) *pitem = p->data; ps->size--; ps->top = ps->top->down; free(p); } return ps->top; } void DestroyStack(Stack *ps) { if (IsEmpty(ps) != 1) ClearStack(ps); free(ps); } void ClearStack(Stack *ps) { while (IsEmpty(ps) != 1) { Pop(ps, NULL); } } void StackTraverse(Stack *ps, void(*visit)()) { PNode p = ps->top; int i = ps->size; while (i--) { visit(p->data); p = p->down; } }
test.c:
#include"Stack.h" #include<stdio.h> void print(Item i) { printf("该节点元素为%d\n", i); } main() { Stack *ps = InitStack(); int i, item; printf("0-9依次入栈并输出如下:\n"); for (i = 0; i < 10; i++) { Push(ps, i); GetTop(ps, &item); printf("%d ", item); } printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n"); StackTraverse(ps, print); printf("栈中元素依次出栈并输出如下:\n"); for (i = 0; i < 10; i++) { Pop(ps, &item); printf("%d ", item); } ClearStack(ps); if (IsEmpty(ps)) printf("\n将栈置空成功\n"); DestroyStack(ps); printf("栈已被销毁\n"); }
④函数调用时的栈:
程序中的"函数调用栈"是栈数据结构的一种应用函数调用栈一般是从高地址向低地址增长的、栈底为内存的高地址处、栈顶为内存的低地址处
函数调用栈中存储的数据为活动记录
⑤程序中的栈:
程序中的栈空间可看做一个顺序栈的应用栈保存了一个函数调用所需的维护信息,函数参数、函数返回地址、局部变量、函数调用上下文
程序栈空间在本质上是一种顺序栈
程序栈空间的访问是通过函数调用进行的
程序栈空间仍然遵从后进先出的规则
相关文章推荐
- JAVA数据结构之String、StringBuffer和StringBuilder之间的区别
- 数据结构
- 数据结构——算法之(043)(c++各种排序算法实现)
- 数据结构——算法之(042)(字符串移位包含的问题, s1是否可以由s2移位后得到)
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 数据结构——算法之(040)(最大公约数问题)
- 数据结构----图(邻接表用法)
- 数据结构——算法之(039)(ip合法性检查)
- 数据结构与算法-求子数组的最大和
- 数据结构与算法-设计包含min函数的栈
- 数据结构实验之队列一:排队买饭
- C# 数据结构 之 二叉树
- 通讯录——数据结构课设
- To_10_r_100_4---在二元数中找出某一值的所有路径
- 数据结构系列之循环队列
- [数据结构]前言——概述
- Java数据结构-稀疏数组
- 数据结构与算法(单循环链表_约瑟夫问题)
- 数据结构算法代码实现——循环链表、双向链表(五)
- To_10_r_100_3---求子数组的最大和