算法导论8:数据结构——栈 2016.1.8

栈在暑假的时候接触过了,当时还写了个计算器,用的中缀表达式后缀表达式的栈操作。

    http://www.cnblogs.com/itlqs/p/4749998.html

今天按照算法导论上的讲解规范了一下代码。主要是栈的初始化、判断空栈、入栈、出栈、遍历栈。

#include<stdio.h>

#define MAXTOP 10 

struct _stack {
    int top;
    int num[MAXTOP+1];
}s;

void init(struct _stack &S)
{
    S.top=0;
}

int sempty(struct _stack &S)
{
    if (S.top==0) return 1;
    else return 0;
}

void push(struct _stack &S,int n)
{
    if (S.top==MAXTOP) {
        printf("栈顶溢出,压栈失败!\n");
    }
    else {
        S.top++;
        S.num[S.top]=n;
    }
}

int pop(struct _stack &S)
{
    if (S.top==0) {
        printf("栈为空,弹出失败!\n");
    }
    else {
        S.top--;
        return S.num[S.top+1];
    }
}

void showstack(struct _stack S)
{
    while (!sempty(S)){
        int k=pop(S);
        printf("|%d|\n",k);
    }
    printf("| |\n");
    printf(" - \n");
}

int main()
{
    int n;
    printf("1:初始化栈;2:入栈;3:出栈;4:退出。\n");
    while (1) {
        int k;
        scanf("%d",&k);
        switch(k) {
            case 1:init(s); break;
            case 2:scanf("%d",&n); push(s,n); break;
            case 3:pop(s); break;
            case 4:return 0;
        }
        showstack(s);
    }
    return 0;
}

明天用链表写一写。

时间: 2024-12-22 05:32:39

算法导论8:数据结构——栈 2016.1.8的相关文章

算法导论5:基数排序 2016.1.5

今天的这个比较神奇,是一个线性复杂度的排序算法O(n),算法导论在这一部分先证明了比较排序的复杂度下界是nlgn,所以基数排序不是基于比较的排序. 其实这种比较方法我们应该都接触过.假设输入的数都是三位以下的数(当然其他位数也可以,类比一下,这里就假设是三位数.两位数.一位数),那么只需要大致3n的复杂度就可以排好序.过程是这样: 先设置辅助空间t[0..9][n] 然后扫第一遍n个数,个位是几就放在t[几]那一行.然后扫一遍t数组,按顺序放回原数组中 然后扫第二遍n个数,十位是几就放在t[几]

算法导论4:快速排序 2016.1.4

今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想.我觉得很有道理. 好吧,不扯了.原谅我看书选择了速读策略,中间有很多感觉目前还很难看懂,以后有时间再细细学习.把略过去的在这里记一下. 一.矩阵乘法算法.复杂度从n^3优化到了n^2.81 (数字比较神奇).因为还没学线性代数,所以以后学了再看. 二.递归复杂度的计算和估计.这部分看起来有些复杂,好像需要比较高的数学水平,有空研究一下. 三.堆排序.这个以前已经写过了.http://www.cnblogs.com/itlqs/p/475

算法导论9:栈的链表实现 2016.1.9

一直想做一个链表实现的栈,今天终于实现了.确实比数组要难多了,打了很久,很长时间花在了想象上(指针调试比较复杂..) 但是链表实现有一个最大的好处,就是动态分配内存,所以一般不会出现栈顶溢出的问题. 值得一提的是代码中比昨天的多了一个build函数.建立一个新栈.那么init函数,还是初始化一个栈.昨天用数组写的时候这两个函数是一样的.但是用链表之后才发现两者还是有区别.一个是从无到有,一个是从有到无.只不过数组的时候本来都有,不涉及自己申请空间的问题,所以两个的操作可以相同,但是到了链表,内存

算法导论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

算法导论第十章 栈队列和链表

本章讲述的是基本的数据结构,如栈.队列和链表.这些都是最最基本的数据结构,具体的就不再啰嗦.然后本章也没有什么需要特别注意的点,哦,有一个小节:指针和对象的实现,可以认真看一下,大概就是用其他的实现方式来代替指针和对象的实现,因为有些语言不支持指针和对象数据类型,那在实现这种链式的数据结构就无法表示,本节介绍的方法就是利用数组和数组下标来构造对象和指针,说白了,就是利用数组来表示链式对象.个人感觉意义不大,权当了解得了. 结合一些常见的笔试面试题,我就用3个习题来总结这一章吧. 1.习题10.1

算法导论------------基本数据结构之二叉树

1.二叉树的定义 二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒. 由定义可知,二叉树中不存在度(结点拥有的子树数目)大于2的节点.二叉树形状如下下图所示: 2.二叉树的性质 (1)在二叉树中的第i层上至多有2^(i-1)个结点(i>=1).备注:^表示此方 (2)深度为k的二叉树至多有2^k-1个节点(k>=1). (3)对任何一棵二叉树T,如果其终端结点数目为n0,度为2的节点数目为n2,则n0=n2+1. 满二叉树:深

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

基本数据结构(算法导论)与python

原文链接 Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO在Python中两者, 都可以简单的用list实现,进, 用append()出, Stack用pop(), Queue用pop(0), pop的时候注意判断len(l) 对于优先队列, 要用到前面讲到的堆 链表和多重数组 这些数据结构在python中就没有存在的价值, 用list都能轻松实现 散列表 为了满足实时查询的需求而产生的数据结构, 查询复杂度的期望是O(1), 最差为O(n)问题描述, 对

算法导论读书笔记-第十四章-数据结构的扩张

算法导论第14章 数据结构的扩张 一些工程应用需要的只是标准数据结构, 但也有许多其他的应用需要对现有数据结构进行少许的创新和改造, 但是只在很少情况下需要创造出全新类型的数据结构, 更经常的是通过存储额外信息的方法来扩张一种标准的数据结构, 然后对这种数据结构编写新的操作来支持所需要的应用. 但是对数据结构的扩张并不总是简单直接的, 因为新的信息必须要能被该数据结构上的常规操作更新和维护. 14.1 动态顺序统计 顺序统计树(order-static tree) : 在红黑树的基础上, 在每个