栈和队列
  ·栈和队列是两种常用的、重要的数据结构
  ·栈和队列是限定插入和删除只能在表的“端点”进行的线性表

  栈
    只能在队尾插入,只能在队尾删除 -- 后进后出
    表尾称为栈顶;表头称为栈底
    插入元素到栈顶(即表尾)的操作,称为入栈
    从栈顶删除最后一个元素的操作,称为出栈

  注意:函数调用的流程就是入栈和出栈的实现,遵循后调用的先返回
  队列
    只能在队尾插入,只能在对队头删除 -- 先进先出

  顺序栈的实现:

  

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef struct Stack{ // 顺序栈,存储类型为int
int *base; // 指向底部
int *top; // 指向顶部
int length;
}Stack;
typedef Stack *SqStack;
int initStack(SqStack *s);
int isEmpty(SqStack s);
int showStack(SqStack s);
int push(SqStack *s,int num);
int pop(SqStack *s);
// 顺序栈的算法
int main(void){
SqStack s = (SqStack)malloc(sizeof(Stack));
initStack(&s);
printf("顺序栈为空:%d \n",isEmpty(s));
printf("顺序栈长度:%d \n",getLength(s));
push(&s,);
push(&s,);
push(&s,);
pop(&s);
showStack(s);
}
// 遍历栈
int showStack(SqStack s){
while(s->top > s->base){
printf("值:%d \n", *(s->top-));
s->top--;
}
return OK;
}
// 入栈
int push (SqStack *s,int num){
// 判断是否上溢
if( getLength(*s) >= (*s)->length ) {
printf("上溢 \n");
return ERROR;
}
*(*s)->top++ = num; return OK;
}
// 出栈
int pop(SqStack *s){
// 判断是否下溢
if(getLength(*s) <= ){
printf("下溢 \n");
return ERROR;
}
(*s)->top--;
//free(temp);
return OK;
}
// 求长度
int getLength(SqStack s) {
int length = s->top - s->base; // 指针相减,结果为值的个数
return length;
}
// 判断是否为空
int isEmpty(SqStack s){
if(s->top == s->base){
return OK;
}else{
return ERROR;
}
}
// 构造一个空栈
int initStack(SqStack *s){
(*s)->base = (int*)malloc(sizeof(int));
if(!(*s)->base){
return ERROR; // 内存分配失败
}
(*s)->top = (*s)->base; // 栈顶指针等于栈底指针
(*s)->length = MAXSIZE;
return OK;
}

链栈的实现:

   

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef struct Stack{ // 链栈,存储类型为int
int x;
struct Stack *next; // 指向的是最后一个元素,入栈出栈都是它 if != NULL
}Stack;
typedef Stack *SqStack;
int initStack(SqStack *s);
int isEmpty(SqStack s);
int showStack(SqStack s);
int push(SqStack *s,int num);
int pop(SqStack *s);
// 链栈的算法
int main(void){
SqStack s = (SqStack)malloc(sizeof(Stack));
initStack(&s);
printf("链栈为空:%d \n",isEmpty(s));
printf("链栈长度:%d \n",getLength(s));
push(&s,);
push(&s,);
push(&s,);
pop(&s);
showStack(s);
}
// 遍历栈
int showStack(SqStack s){
while(s) {
printf("值:%d \n", s->x);
s = s->next;
}
return OK;
}
// 入栈
int push (SqStack *s,int num){
SqStack temp = (SqStack)malloc(sizeof(Stack));
temp->x = num;
temp->next = (*s); // 精髓之处
(*s) = temp; // !!! 指针的运用
return OK;
}
// 出栈
int pop(SqStack *s){
// 判断是否下溢
if(!(*s)){
printf("下溢 \n");
return ERROR;
}
SqStack temp = *s;
(*s) = (*s)->next;
free(temp); // 释放内存
return OK;
}
// 求长度
int getLength(SqStack s) {
int length = ;
while(s){
length++;
s = s->next;
}
return length;
}
// 判断是否为空
int isEmpty(SqStack s){
if(!s){
return OK;
}else{
return ERROR;
}
}
// 构造一个空栈
int initStack(SqStack *s){
// 构建一个空栈,栈顶指针置为空
*s = NULL;
return OK;
}

 循环顺序队列的实现:

  

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100 // 最大队列长度
// 建立顺序队列类型
typedef struct{
int a[MAXSIZE];
int front; // 队头
int rear; // 队尾
}SqQueue; // 展示
void display(SqQueue sq)
{
int i=sq.front;
if(sq.front==sq.rear)
{
printf("none\n");
return ;
}
while(i!=sq.rear)
{
printf("%5d",sq.a[i]);
i++;
i=i%MAXSIZE;
}
printf("\n");
} // 队列的初始化
int init(SqQueue *q){
q->front = ;
q->rear = ;
} // 入队
void insert(SqQueue *sq,int x)
{
if((sq->rear+)%MAXSIZE==sq->front)
{
printf("full\n");
return ;
}
sq->a[sq->rear]=x;
sq->rear=(sq->rear+)%MAXSIZE;
printf("front = %d\n",sq->front);
printf("rear = %d\n",sq->rear);
} // 出队
void del(SqQueue *sq)
{
if(sq->front==sq->rear)
{
printf("none\n");
return ;
}
sq->front=(sq->front+)%MAXSIZE;
printf("front = %d\n",sq->front);
printf("rear = %d\n",sq->rear);
} int main(void){
SqQueue q;
init(&q);
insert(&q,);
insert(&q,);
del(&q);
insert(&q,);
insert(&q,);
display(q);
}

c数据结构 -- 栈与队列的更多相关文章

  1. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  2. C数据结构-栈和队列,括号匹配举例---ShinePans

    1.栈和队列是两种特殊的线性表             运算操作被限定仅仅能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构 ...

  3. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

  4. &10 基本数据结构——栈,队列和链表

    #1,栈(stack) 定义[来自百度]:栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素 ...

  5. Python数据结构——栈、队列的实现(二)

    1. 一个列表实现两个栈 class Twostacks(object): def __init__(self): self.stack=[] self.a_size=0 self.b_size=0 ...

  6. Python数据结构——栈、队列的实现(一)

    1. 栈 栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top).栈的基本操作有PUSH(入栈)和POP(出栈).栈又被称为LIFO(后入先出)表. 1.1 ...

  7. js 数据结构-栈与队列

    /*[客栈的盘子/月井里的货物,后进先出]栈顶:最先入口/出口的位置栈底:最慢最晚出栈的位置*/ function Stack() { var item = []; //推(将货物推入月井) this ...

  8. 【栈和队列】5、队列概述与数组队列的基本实现 - Java

    3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...

  9. 【栈和队列】2、栈的基本实现 - Java

    简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 栈的实现 Stack<E> void push(E) E pop() E peek() int getSize() b ...

随机推荐

  1. input清空和重置select下拉框

    背景 一般页面搜索条件都会有input输入框和select选择框,同时页面上都会有重置reset按钮,这时就需要清空input和重置select 实现 清空input 清空单个input: $(&qu ...

  2. 吴裕雄--天生自然 HADOOP大数据分布式处理:安装WinSCP

    下载安装包

  3. 【笔记】机器学习 - 李宏毅 - 5 - Classification

    Classification: Probabilistic Generative Model 分类:概率生成模型 如果说对于分类问题用回归的方法硬解,也就是说,将其连续化.比如 \(Class 1\) ...

  4. MySQL基础篇(01):经典实用查询案例,总结整理

    本文源码:GitHub·点这里 || GitEE·点这里 一.连接查询 图解示意图 1.建表语句 部门和员工关系表: CREATE TABLE `tb_dept` ( `id` int(11) NOT ...

  5. Linux下文件的七种类型

    文件属性 1. 本章引言 上一章通过学习文件io,知道了如何使用文件io来打开文件,对文件进行读写等操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论. 1.1 什么是文件属性? 我们通 ...

  6. appium知识点

    1 appium元素获取技巧 # 就是页面滑动 driver.swipe(x1, y1, x1, y2, t) # 拿到所有跟元素有关的标签,其实是个列表 driver.find_elements_b ...

  7. OpenCV3.2.0+VS2015开发环境配置

    vs2015安装可参考:https://www.jianshu.com/p/391e67529bd3 OpenCV3.2.0配置可参考:https://www.jianshu.com/p/026093 ...

  8. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

  9. 杭电oj_2047——阿牛的EOF牛肉串(java实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2047 思路:先是列出了四个,但是没发现规律,然后开始画递归树,在其中找到了规律,算出递归式为f(n) ...

  10. nginx proxy_set_header Host $host 和 proxy_set_header Host $http_host 的作用对比

    转载自https://www.jianshu.com/p/7a8a7eb3707a 1.浏览器直接访问服务,获取到的 Host 包含浏览器请求的 IP 和端口 测试服务器,centos 7 sudo ...