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

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

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

  顺序栈的实现:

  

#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. Postman实现文件下载功能测试

    背景 实现一个模板下载的功能,然后想用postman进行文件下载的功能测试 实现 然后会弹出下载框 tips:我第一次点的时候,没有任何反应,以为是卡死了,后来发现是弹出的下载框在postman框下面 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  3. gulp常用插件之gulp-replace使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-replace这是一款gulp3的字符串替换插件. 更多使用文档请点击访问gulp-replace工具官网. 安装 一键安装不多解释 n ...

  4. JDK下载安装与环境变量配置图文教程【超详细】

    JDK下载安装与环境变量配置图文教程[超详细] 创建时间:2019年11月13日11时02分 文章目录 1. JDK介绍 1.1 什么是JDK? 1.2 JDK版本介绍 2. JDK下载与安装 3.w ...

  5. Java多线程之synchronized和volatile

    概述 用Java来开发多线程程序变得越来越常见,虽然Java提供了并发包来简化多线程程序的编写,但是我们有必要深入研究一下,才能更好的掌握这块知识. 本文主要对Java提供的底层原语synchroni ...

  6. 手写数字识别——利用keras高层API快速搭建并优化网络模型

    在<手写数字识别——手动搭建全连接层>一文中,我们通过机器学习的基本公式构建出了一个网络模型,其实现过程毫无疑问是过于复杂了——不得不考虑诸如数据类型匹配.梯度计算.准确度的统计等问题,但 ...

  7. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  8. 手把手带你开发一款 IIS 模块后门

    https://cloud.tencent.com/developer/article/1507913 首先准备工具 VS2017 IIS 开始开发 先打开 VS 创建一个 winfrom 项目然后添 ...

  9. Struts2-057远程代码执行漏洞(s2-057/CVE-2018-11776)复现

    参考了大佬的链接:https://github.com/jas502n/St2-057 00x01前言 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用 ...

  10. HDU-1506 Largest Rectangle in a Histogram【单调栈】

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...