数据结构之栈
来源:互联网 发布:在哪里买正版windows 编辑:程序博客网 时间:2024/06/05 04:08
栈(stack)又称堆栈,是一种特殊的线性结构,栈的特殊之处在于:所有对于栈的操作都是在栈的一端(顶部)进行的,如对栈进行元素添加(入栈)元素删除(弹栈/出栈),按照“后进先出”的规则进行操作。栈在程序设计中特别重要,程序的调试和运行都需要栈的支撑。
一 栈的定义和基本操作
栈(stack)是限定在表的一端进行插入和删除操作的线性表。插入元素称为(入栈),删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。
举个例子来说明栈的结构和操作:将书放入没有盖的盒子中,这样要将书取出来,只能将最上层的书先取出来,即将最后放入的书先取出来。所以栈又称为后进先出的线性表,简称FILO(first in last out)
栈的基本操作如下
(1)初始化一个栈
(2)判断是否是空栈
(3)判断是否是满栈
(4)进栈
(5)出栈
(6)取栈顶元素
(7)求当前栈元素个数
二 栈的顺序存储结构和基本操作
因为栈是一种特殊的线性结构,所以有两种存储结构,即顺序存储机构和链式存储结构。接下来给出顺序存储机构的相关实现代码。
#include <stdio.h>#include <stdlib.h>#define Size 100typedef struct{ int data[Size]; int top;} Stack;顺序栈利用数组来实现 数组的大小定义为
Size 100用top作为栈顶元素的的下标,top的范围为0到Size-1,通常规定top等于0的时候表示栈空,即数组data[0]不存放数据。
1.初始化一个栈
void init_stack(Stack *s){ int i; s->top=0; printf("请输入栈的元素 以-1结束输入"); scanf("%d",&i); while(is_full(s)!=1&&i!=-1) { s->data[++s->top]=i; scanf("%d",&i); }}从键盘输入栈的元素,假定当输入为-1时作为输入结束的标志
2.判断一个栈是否为空
通过判断top是否为0来判断栈是否为空
int is_empty(Stack *s){ if (s->top==0) return 1; else return 0;}3.判断一个栈是否已满
通过判断top是否为Size-1来判断栈是否已经满了
int is_full(Stack *s){ if (s->top==(Size-1)) return 1; else return 0;}
4.数据进栈操作
void push_stack(Stack *s,int i){ if(is_full(s)) printf("栈已满 入栈失败"); else { s->data[++s->top]=i; }}5.数据出栈操作
void pop_stack(Stack *s){ if(is_empty(s)) printf("栈已空 出栈失败"); else { return s->data[s->top--]; }}6.取栈顶元素操作
int get_top(Stack *s){ if(is_empty(s)) printf("栈已空 取元素失败"); else { printf("%d\n",s->data[s->top]); return s->data[s->top]; }}7.栈置空操作
void clean_stack(Stack *s){ s->top=0;}
8.求当前栈中元素的个数
int current_size(Stack *s){ printf("栈内有%d个元素\n",s->top); return s->top;}
三 栈的链式存储结构及其相关操作
typedef struct snode{ int data; struct snode *next;}LinkStack;
1.初始化一个栈
LinkStack* init_linkstack(){ int i; LinkStack *top=NULL; LinkStack *p; printf("请输入栈的元素或者以-1结束"); scanf("%d",&i); while(i!=-1) { p=(LinkStack*)malloc(sizeof(LinkStack)); p->data=i; p->next=top; top=p; scanf("%d",&i); } return top;}
2.数据进栈操作
LinkStack* push_linkstack(LinkStack *top,int x){ LinkStack *p; p=(LinkStack*)malloc(sizeof(LinkStack)); p->data=x; p->next=top; top=p; return top;}
3.数据出栈操作
LinkStack* pop_linkstack(LinkStack *top){ LinkStack *p; p=top; top=top->next; free(p); return top;}4.输出栈中所有元素
void print_linkstack(LinkStack *top){ LinkStack *p=top; while(p!=NULL) { printf("%d\n",p->data); p=p->next; }}
阅读全文
0 0
- java数据结构之栈
- 数据结构之顺序栈
- 数据结构之链栈
- 数据结构之栈
- 数据结构复习之【栈】
- 数据结构之栈
- 数据结构之栈
- 数据结构之栈实现
- 数据结构学习之栈
- 数据结构之栈
- 数据结构之栈
- 复习数据结构之栈
- 数据结构之栈
- 数据结构之栈
- 大话数据结构之栈
- 数据结构之顺序栈
- 数据结构之链式栈
- 数据结构之顺序栈
- Redis Zinterstore 命令
- MySQL学习划重点(《MYSQL必知必会》总结)
- 【原】十分钟搞定pandas
- Qt5.9.1编译QSanguosha
- org.apache.commons.lang3.ArrayUtils源码分析
- 数据结构之栈
- 查看和修改Mysql数据库建表的时候默认的存储引擎
- 矩阵乘法
- 1042 数字0-9的数量【数位dp】
- 微信小程序地图划线
- 自己实现的LinkedList
- git 游离状态的解决办法
- CV520直接pin对pin替换 MS520,直接替换,无需修改硬件以及软件
- java面向对象基础