算法导论11:优化后的数组实现的队列 2016.1.11

本来想假期再继续,结果发现写博客已经成了总结自己的一种习惯,所以还是继续写吧。

其实有一部分原因是今天英语考砸了。。哈哈,不管那些了,看来以后学习方式得改变一下,不能太功利,从简单开始,一点一点做好。

今天是队列的数组优化。昨天的队列有一个致命弱点,就是能盛放的数据数量越来越少,至于原因可以自己思考也可以上网搜索。如果是链表实现的话因为是动态分配空间,就完全不会有这个问题。

优化就是用了取模运算,实现数组空间的循环运用。

下面是代码:

#include<stdio.h>

#define MAXTOP 10 

struct _queue {
    int head,tail;
    int num[MAXTOP+1];
}s;

void init(struct _queue &S)
{
    S.head=0;
    S.tail=1;
}

int sempty(struct _queue &S)
{
    if ((S.head+1)%(MAXTOP+1)==S.tail) return 1;
    else return 0;
}

void enqueue(struct _queue &S,int n)
{
    if ((S.tail+1)%(MAXTOP+1)==S.head) {
        printf("队列溢出!\n");
    }
    else {
        S.num[S.tail]=n;
        S.tail=(S.tail+1)%(MAXTOP+1);
    }
}

int dequeue(struct _queue &S)
{
    if (sempty(S)) {
        printf("空队列!\n");
    }
    else {
        S.head=(S.head+1)%(MAXTOP+1);
        int k=S.num[S.head];
        return k;
    }
}

void showqueue(struct _queue S)
{
    while (!sempty(S)){
        int k=dequeue(S);
        printf("|%d|\n",k);
    }
    printf("| |\n");
}

int main()
{
    int n;
    init(s);
    while (1) {
        printf("1:初始化队列;2:入队列;3:出队列;4:退出。\n");
        int k;
        scanf("%d",&k);
        switch(k) {
            case 1:init(s); break;
            case 2:scanf("%d",&n); enqueue(s,n); break;
            case 3:dequeue(s); break;
            case 4:return 0;
        }
        showqueue(s);
    }
    return 0;
}
时间: 2024-10-24 20:59:27

算法导论11:优化后的数组实现的队列 2016.1.11的相关文章

算法导论3:最大子数组问题 2016.1.3

顶着期末复习的压力,还是在今天过完之前看完了一个算法——最大子数组问题. <算法导论>中引入这个问题是通过股票的购买与出售,经过问题转换(转换的过程比较简单,但是不好想),将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题 ,具体内容是:   13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7   找到这连续的16个数里面的连续和最大的子数组;   书中差不多是这个意思:假定我们要寻找子数组A[lo

算法导论10:栈链表的简化、队列的数组实现 2016.1.10

新年的前十天做了比较有意义的事情就是坚持每天写博客,明天就开始期末考试了,所以等假期再继续学习. 把昨天提到的S.bottom简化之后又改了栈的链表.代码如下(已折叠): #include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(no

算法导论6:排序小结和最值取法 2016.1.6

今天想做测试各个排序算法运行时间比较的程序,来对这几天学的排序算法小结一下.所以我先生成了1000000个1~150之间的随机数存到文件里.然后做了一个测试运行时间的程序.想看一下结构.但是结果效果并不太好.实践中,自己做的qsort函数和mergesort函数并没有理想中的那么快. 结果是这样:(可能并不准确,但却是是运行结果) 库函数快速排序:0.139000 seconds自制快速排序:0.375000 seconds归并排序:0.358000 seconds堆排序:0.525000 se

算法导论 10.1-2 用一个数组实现两个栈

一.题目 用一个数组A[ 1....N ]实现两个栈,除非数组的每一个单元都被使用,否则栈例程不能有溢出,注意PUSH和POP操作的时间应为O(1). 二.解法 对于一个数组,由它的两端作为栈底,栈向数组中间扩展.当数组中每个元素被用到时,栈满. 三.代码 struct Node; typedef Node *ComStack; struct Node { int Capacity; int TopL; int TopR; ElementType *Array; }; ComStack Crea

算法导论 4.1 最大子数组问题

8. 实现代码 1 #include <iostream> 2 using namespace std; 3 4 const long long NINF = -1 << 30; 5 const int N = 100; 6 struct ans { 7 long long sum; 8 int left; 9 int right; 10 }; 11 12 13 ans FIND_CROSS_MAX_SUBARRAY(int a[], int low,int mid, int hi

算法导论 之 红黑树 - 插入[C语言]

作者:邹祁峰 邮箱:[email protected] 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自"祁峰"的CSDN博客 1 引言 在之前的博文中,本人对平衡二叉树的处理做了较详尽的分析,有兴趣的朋友可以参阅博文<算法导论 之 平衡二叉树 - 创建 插入 搜索 销毁>和<算法导论 之 平衡二叉树 - 删除>.平衡二叉树AVL是严格的平衡树,在增删结点时,其旋转操作的次数较多:而红黑树

算法导论——lec 11 动态规划及应用

和分治法一样,动态规划也是通过组合子问题的解而解决整个问题的.分治法是指将问题划分为一个一个独立的子问题,递归地求解各个子问题然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题不是相互独立的情况,即各个子问题包含公共的子子问题.在这种情况下,如果用分治法会多做许多不必要的工作,重复求解相同的子子问题.而动态规划将每个子问题的解求解的结果放在一张表中,避免了重复求解. 一. 动态规划介绍 1. 动态规划方法介绍: 动态规划主要应用于最优化问题, 而这些问题通常有很多可行解,而我们希

【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)

问题来源 <算法导论>P223 9.3-8: Let X[1..n] and Y[1..n] be two arrays, each containing nnumbers already in sorted order. Give an O(lgn)-time algorithm to find themedian of all 2n elements in arrays X and Y. 翻译过来即:求两个等长(n个元素)的已排序数组A和B的中位数 方案1:对两个数组进行归并直到统计到第n

《算法导论》— Chapter 11 散列表

1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言中的标识符相对应.实现字典的一种有效数据结构为散列表. 散列表是普通数组的推广,因为可以对数组进行直接寻址,故可以在O(1)的时间内访问数组的任意元素.对于散列表,最坏情况下查找一个元素的时间与在链表中查找的时间相同,为O(n),但是在实践中,散列表的效率通常是很高的,在一些合理的假设下,散列表中查