妙趣横生的算法--栈和队列

简介:

栈                                                                      

栈的特点是先进后出,一张图简单介绍一下。image

复制代码
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef  char ElemType;
typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
}sqStack;

void initStack(sqStack *s)
{
    /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(!s->base) exit(0);     /*分配空间失败*/
    s->top = s->base;       /*最开始,栈顶就是栈底*/
    s->stacksize = STACK_INIT_SIZE;   /*最大容量为STACK_INIT_SIZE */
}
void Push(sqStack *s, ElemType e){
    if(s->top - s->base >= s->stacksize){
    /*栈满,追加空间*/
    s->base = (ElemType *)realloc(s->base, (s->stacksize + 
    STACKINCREMENT)*sizeof(ElemType));
    if(!s->base) exit(0);   /*存储分配失败*/
    s->top = s->base + s->stacksize;
    s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
    }
    *(s->top) = e;  /*放入数据*/
        s->top++;
}

void Pop(sqStack *s , ElemType *e){
    if(s->top == s->base) return;//栈里面没有元素了则返回
    *e = *--(s->top); //删除栈顶的元素    
}

int StackLen(sqStack s){
    return (s.top - s.base) ;//计算栈的长度 
}
void main()
{
    ElemType c;
    sqStack s;
    int len , i , sum = 0;
    printf("Please input a Binary digit\n");

    initStack(&s);  /*创建一个栈,用来存放二进制字符串*/
    /*输入0/1字符表示的二进制数,以#结束*/
    scanf("%c",&c);
    while(c!='#')//遇到#则结束
    {
        Push(&s,c);//输入一个压入一个
        scanf("%c",&c);
    }
    len = StackLen(s);  /*得到栈中的元素个数,即二进制数的长度*/

    for(i=0;i<len;i++){
        Pop(&s,&c);
        sum = (int)(sum + (c-48) * pow(2,i));  /*转换为十进制*/
        //二进制转十进制的算法 
    }
    printf("Decimal is %d\n",sum);
}
复制代码

队列                                                                  

队列的特点是先进先出,就跟我们平常排队一个意思。image

复制代码
#include "stdio.h"
#include "stdlib.h"
typedef char ElemType;
typedef struct QNode{
    ElemType data;
    struct QNode *next;
} QNode , *QueuePtr;
typedef struct{
    QueuePtr front;   //队头指针
    QueuePtr rear;    //队尾指针
}LinkQueue;

void initQueue(LinkQueue *q){
    /*初始化一个空队列*/
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); /*创建一个头结点,队头队尾指针                                                                指向该结点*/
    if( !q->front) exit(0);     /*创建头结点失败*/
    q->front->next = NULL;     /*头结点指针域置NULL*/
}

void EnQueue(LinkQueue *q, ElemType e){
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));  /*创建一个队列元素结点*/
    if( !q->front) exit(0);     /*创建头结点失败*/
    p->data = e;//元素节点写入数据
    p->next = NULL;//元素节点的向后的指针指向空
    q->rear ->next = p;//将队列中的队尾指针指向刚生成的元素节点
    q->rear = p;
}
void DeQueue(LinkQueue *q, ElemType *e){
    /*如果队列q不为空,删除q的队头元素,用e返回其值*/
    QueuePtr p;
    if(q->front == q->rear) return;  /*队列为空,返回*/
    p = q->front->next;//队头给p
    *e = p->data;//取出来的队头的数据
    q->front->next = p->next;//取出来的队头的下一个指向给新的队头的指向
    if(q->rear == p) q->rear = q->front;  /*如果队头就是队尾,则修改队尾指针*/
    free(p);
}
/*测试函数*/
void main()
{
    ElemType e;
    LinkQueue  q;
    initQueue(&q);           /*初始化一个队列q*/
    printf("Please input a string into a queue\n");
    scanf("%c",&e);
    while(e!='@'){
        EnQueue(&q,e);   /*向队列中输入字符串,以@表示结束*/ 
        scanf("%c",&e);
    }
    printf("The string into the queue is\n");
    while(q.front != q.rear){   /*将队列中的元素出队列,并打印在屏幕上*/
        DeQueue(&q,&e);
        printf("%c",e);
    }
    printf("\n");
}
复制代码

 

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3667093.html,如需转载请自行联系原作者

相关文章
|
10月前
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
165 1
|
12月前
|
算法
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
133 14
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
737 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
238 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
324 3
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
169 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
算法 数据挖掘
【栈和队列】算法题 ---- 力扣(二)
【栈和队列】算法题 ---- 力扣
|
存储 算法
【栈和队列】算法题 ---- 力扣(一)
【栈和队列】算法题 ---- 力扣
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。

热门文章

最新文章