IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构(c语言版) 第三章 栈和队列 -> 正文阅读

[数据结构与算法]数据结构(c语言版) 第三章 栈和队列

数据结构(c语言版) 第三章 栈和队列

栈(栈的表示和实现):

  • 抽象数据栈的定义:

栈(stack)栈是限定仅在表尾进行插入或删除操作的线性表,因此表尾对栈有着特殊的含义,称为栈顶(top),相应表头成为栈底(bottom),不含元素的空表称为空栈。

因为栈的进出都是从表尾进行插入和删除,于是又叫后进先出(last in first out)也能叫先进后出。

  • 线性表类似,对于栈来说,也有两种存储结构(1)顺序栈(2)链式栈

(1)顺序栈:

顺序栈的结构结构体单位我们一般有两个指针和一个整型数据,其中整型数据代表此时栈的总空间大小,其中一个指针始终指向栈底,另一个指针始终指向栈顶。

当两个指针指向同一个位置时,那么此时就是空栈。

栈的结构的实现

struct stacks{
	int *base;
	int *top;
	int stacksize;
};

开辟一个栈

void creatstack(struct stacks *s,int size){
	s->base = (int*)malloc(size*sizeof(int));
	if(!s->base)exit(0);
	s->top = s->base;
	s->stacksize = size;
}

向栈中压入元素

void push(struct stacks *s,int elements){
	if(s->top-s->base>=s->stacksize){
		s->base = (int*)realloc(s->base,(s->stacksize+1)*sizeof(int));
		if(!s->base)exit(0);
		*(s->top) = elements;
		s->top = s->base + s->stacksize+1;
		s->stacksize ++;
	}else{
		*(s->top) = elements;
		s->top ++;
		s->stacksize ++;
	}
}

将栈顶的元素取出

void pop(struct stacks *s){
	if(s->base!=s->top){
		s->stacksize --;
		int *x = s->top;
		s->top --;
	}else{
		exit(0);
	}
		
}

判断一个栈是不是空栈

int emptys(struct stacks *s){
	if(s->base==s->top)return 1;
	else return 0;
} 

完整的代码

#include <stdio.h>
#include <stdlib.h>
struct stacks{
	int *base;
	int *top;
	int stacksize;
};
void creatstack(struct stacks *s,int size){
	s->base = (int*)malloc(size*sizeof(int));
	if(!s->base)exit(0);
	s->top = s->base;
	s->stacksize = size;
}
void push(struct stacks *s,int elements){
	if(s->top-s->base>=s->stacksize){
		s->base = (int*)realloc(s->base,(s->stacksize+1)*sizeof(int));
		if(!s->base)exit(0);
		*(s->top) = elements;
		s->top = s->base + s->stacksize+1;
		s->stacksize ++;
	}else{
		*(s->top) = elements;
		s->top ++;
		s->stacksize ++;
	}
}
int emptys(struct stacks *s){
	if(s->base==s->top)return 1;
	else return 0;
} 
void pop(struct stacks *s){
	if(s->base!=s->top){
		s->stacksize --;
		int *x = s->top;
		s->top --;
	}else{
		exit(0);
	}
		
}
void printstack(struct stacks *s){
	for(int *i = s->base;i < s->top;i ++){
		printf("%d ",*i);
	}
}
int main(){
	struct stacks s;
	creatstack(&s,10);
	for(int i = 1;i <= 4;i ++){
		int x;
		scanf("%d",&x);
		push(&s,x);
	}
	pop(&s);
	printstack(&s);
	pop(&s);
	pop(&s);
	pop(&s);
	printf("\n%d",emptys(&s));
} 

验证push

  • 这里最后我用了三个pop函数将栈中的所有元素都给删除了。
  • 让我们验证一下我们写的代码是否正确。
  • 先输入四个数验证一些push函数
    在这里插入图片描述

验证pop

  • 显然输入了四个数,也输出了四个数,我们的push函数是没有问题。
  • 接下来我们验证pop函数,输入四个数,并pop一次。
    在这里插入图片描述
  • 显然输入四个数,输出三个数,并且按照栈的后进先出规则,删除的是栈顶的元素,即最后一个元素,所以输出三个数是正确的,pop函数没问题。

验证empty

  • 最后验证一下empty函数
  • 先输入四个数,并pop一次,此时栈还有三个元素,所以empty函数应该输出0(假值)。
    在这里插入图片描述
  • 输出的值是0,说明empty对栈内有元素的判断是没有问题的。
  • 接下来输入四个数并全部pop出去,看一下empty函数是否正确。
    在这里插入图片描述
  • 最后输出的是1(真值),所以empty函数判断空栈也是没有问题的,综上,我们完成了栈的表示和实现。

链式栈

  • 链式栈的本质其实就是特殊的线性表,当线性表只能用尾插法插入元素并且只能从表的尾部提取元素,就是栈。
    这一部分我没有写代码,因为前面线性表的链式结构删掉一些函数就可以作为栈使用,所以再写一遍也是没有任何意义的,顶多练练手

队列下次再说

队列我们下次再叙述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:45:16  更:2021-08-22 13:45:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:44:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码