哈佛大学公开课:计算机科学cs50 学习笔记及代码练习(第14集:栈,队列,哈希表,树)

周末写代码

--------------------------------2018.8.7---------------------------

1. stack

stack 后进先出(LIFO)结构。下面用数组实现栈,用malloc使栈的容量可扩展。

stack.c

这里要特别注意:

(1) Destroy()函数中,free(s->data); 以及 s->data = NULL; 否则出现野指针。因为在Init()中用了malloc;

(2) 另外,取栈顶元素 Top() 函数 不要用返回值,因为如果栈空就没有元素可以返回。用指针传参好了: void Top(Stack *s, datatype * topElement)

(3) 初始化函数 bool Init()要加入判断条件,判断s->data 是否是NULL,因为malloc 若在heap里面分配内存不成功就返回NULL,因此初始化函数也返回bool,初始化不成功返回false

#include "stack.h"
#include <stdio.h>

static int realsize = MAXSIZE;
 
// initialize the stack
bool Init(Stack *s)
{
    s->data = (datatype *)malloc(sizeof(datatype) * MAXSIZE);
    s->top = -1;
    if (s->data != NULL)
        return true;
    else
        return false;
}
 
// is the stack empty?
bool isEmpty(Stack *s)
{
    if(s->top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 
// enlarge the capacity of the stack
void enlarge(Stack *s)
{
    if(s->top == realsize - 1)
    {
        realsize *= 2;
        s->data = (datatype *)realloc(s->data, realsize * sizeof(datatype));
    }
}
 
// push element into the stack
void Push(Stack *s, datatype element)
{
    enlarge(s);
    s->top++;
    s->data[s->top] = element;
}
 
// pop element out of the stack
void Pop(Stack *s)
{
    if(!isEmpty(s))
    {
        s->top--;
    }
    else
    {
        printf("stack is empty, can not be poped!\n");
    }
}
 
// get the top element of the stack
void Top(Stack *s, datatype * topElement)
{
    if(!isEmpty(s))
    {
        *topElement = s->data[s->top];
    }
    else
    {
        printf("stack is empty, no top element!\n");
    }
}
 
// destroy the stack
void Destroy(Stack *s)
{
    s->top = -1;
    free(s->data); 
    s->data = NULL;
}

 

stack.h

#ifndef STACK_H
#define STACK_H

#include<stdbool.h>
#include<stdlib.h>

#define MAXSIZE 10

typedef int datatype;

//Sequence Stack 
typedef struct stack
{
    datatype *data; // array
    int top;
} Stack;


// initialize the stack
bool Init(Stack *s);

// is the stack empty?
bool isEmpty(Stack *s);

// enlarge the capacity of the stack
void enlarge(Stack *s);

// push element into the stack
void Push(Stack *s, datatype element);

// pop element out of the stack
void Pop(Stack *s);

// get the top element of the stack
void Top(Stack *s, datatype * topElement);

// destroy the stack
void Destroy(Stack *s);


#endif

 

main.c

#include "stack.h"
#include <stdio.h>

int main(void)
{
    // build a stack
    Stack * s = (Stack*)malloc(sizeof(Stack));
    // initialize the stack
    if (!Init(s))
        return 1;
    // is empty?
    if (isEmpty(s))
        printf("stack is empty \n");
    else
        printf("stack is not empty \n");
    // push 22 elements into the stack
    for (datatype i = 0; i < 22; ++i)
        Push(s, i);
    
    // what is the top element
    datatype i = -1;
    datatype * topElement = &i;
    Top(s, topElement);
    printf("%d\n", *topElement);
    // pop 10 elements out of the stack
    for (datatype i = 0; i < 10; ++i)
        Pop(s);
    // what is the top element of the stack now?
    i = -1;
    Top(s, topElement);
    printf("%d\n", *topElement);
    // destroy the stack
    Destroy(s);
    // what is the top element of the stack now?
    i = -1;
    Top(s, topElement);
    printf("%d\n", *topElement);


    return 0;
}

 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(stack)

add_compile_options(-std=c11)

add_executable (stack main.c stack.c)

结果如下:

 

 

2. Queue 队列

队列是先进先出(FIFO)结构。下面用链表实现队列

queue.c

#include "queue.h"
#include <stdlib.h>

// initialize a queue
void InitQueue(Queue* queue)
{
    if (queue == NULL)
        return;
    queue->tail = (Node*)malloc(sizeof(Node));
    if (queue->tail == NULL)
        return;
    queue->tail->data = -1;
    queue->head = queue->tail;
    queue->tail->next = NULL;
}

// push a element into the queue
void PushQueue(Queue* queue, datatype data)
{
    if (queue == NULL)
        return;
    Node * newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL)
        return;
    newNode->data = data;
    newNode->next = NULL;
    queue->tail->next = newNode;
    queue->tail = newNode;
}

// pop a element out of the queue
void PopQueue(Queue* queue)
{
    if (queue == NULL)
        return;
    if (IsEmpty(queue))
        return;
    datatype popValue = queue->head->data;
    Node *popNode = queue->head;
    queue->head = queue->head->next;
    free(popNode);
    popNode = NULL;
}

// is the queue empty?
bool IsEmpty(Queue* queue)
{
    return (queue->head == queue->tail);
}

// destroy the queue
void DestroyQueue(Queue* queue)
{
    if (queue == NULL)
        return;
    while(!IsEmpty(queue))
    {
        PopQueue(queue);
    }
    free(queue->tail);
    // free(queue->head);
}

// print the queue
void PrintQueue(Queue* queue)
{
    if (queue == NULL)
        return;
    if(IsEmpty(queue))
    {
        printf("empty queue.\n");
        return;
    }
    Node* curNode= queue->head->next;
    while(curNode)
    {
        if (curNode->next !=NULL)
            printf("%d==>", curNode->data);
        else
            printf("%d ", curNode->data);
        curNode = curNode->next;
    }
    printf("\n");
}

 

queue.h

#ifndef QUEUE_H
#define QUEUE_H


#include <stdio.h>
#include<stdbool.h>

typedef int datatype;

typedef struct node
{
    datatype data;
    struct node* next;
} Node;

typedef struct queue
{
    Node* head;
    Node* tail;
} Queue;

// initialize a queue
void InitQueue(Queue*);

// push a element into the queue
void PushQueue(Queue*, datatype);

// pop a element out of the queue
void PopQueue(Queue* queue);

// print the queue
void PrintQueue(Queue* queue);

// is the queue empty?
bool IsEmpty(Queue* queue);

// destroy the queue
void DestroyQueue(Queue* queue);


#endif

 

main.c

#include "queue.h"
#include <stdlib.h>


int main(void)
{
    Queue * queue = (Queue*)malloc(sizeof(Queue));
    InitQueue(queue);

    for (datatype i = 0; i != 4; ++i)
        PushQueue(queue, i);
    
    PrintQueue(queue);

    PopQueue(queue);

    PrintQueue(queue);

    for (int i = 0; i != 10; ++i)
        PopQueue(queue);

    PrintQueue(queue);

    for (datatype i = 0; i != 5; ++i)
        PushQueue(queue, i);

    PrintQueue(queue);

    DestroyQueue(queue);

    PrintQueue(queue);

    free(queue);
    queue = NULL;
    
    return 0;
}

 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(stack)

add_compile_options(-std=c11)

add_executable (stack main.c stack.c)

 

结果:

哈佛大学公开课程讲义 哈佛大学 哈佛公开课:公平与正义(中英字幕) http://www.manfen.net/thread-6680-1-1.html 哈佛大学最受欢迎的开放课程:哈佛幸福课 http://www.manfen.net/thread-6801-1-1.html 哈佛大学公开课——好市民自由与适应 http://www.manfen.net/thread-6650-1-1.html 哈佛大学公开课——自由选择我属于谁? http://www.manfen.net/thread-6649-1-1.html 耶鲁大学 耶鲁大学开放课程—哲学:死亡 http://www.manfen.net/thread-6303-1-1.html 耶鲁大学开放课程:聆听音乐(共23讲) http://www.manfen.net/thread-6298-1-1.html 耶鲁大学开放课程:古希腊历史简介 中英双语字幕 http://www.manfen.net/thread-7323-1-1.html 耶鲁大学开放课程:有关食物的心理学,生物学和政治学 http://www.manfen.net/thread-7275-1-1.html 耶鲁课程.:欧洲文明 http://www.manfen.net/thread-7074-1-1.html 耶鲁大学开放课-金融市场 http://www.manfen.net/thread-6923-1-1.html 耶鲁大学开放课程:基础物理 http://www.manfen.net/thread-6734-1-1.html 耶鲁大学公开课:1945年后的美国小说 http://www.manfen.net/thread-6837-1-1.html 耶鲁大学开放课程:美国内战与重建 http://www.manfen.net/thread-6804-1-1.html 耶鲁大学开放课程:罗马建筑 http://www.manfen.net/thread-6803-1-1.html 耶鲁大学开放课程:古希腊历史简介(中英双语字幕) http://www.manfen.net/thread-6788-1-1.html 耶鲁大学开放课程:旧约全书导论 http://www.manfen.net/thread-6789-1-1.html 耶鲁大学开放课程:生物医学工程探索 http://www.manfen.net/thread-6733-1-1.html 耶鲁大学开放课程:【欧洲文明】 http://www.manfen.net/thread-6732-1-1.html 耶鲁大学开放课程:心理学导论 http://www.manfen.net/thread-6284-1-1.html 耶鲁大学开放课程:博弈论 http://www.manfen.net/thread-6291-1-1.html 耶鲁大学开放课程-社会学:全球人口增长问题 http://www.manfen.net/thread-9142-1-1.html 耶鲁大学开放课程-人文学科:现代诗歌 http://www.manfen.net/thread-9144-1-1.html 耶鲁大学开放课程:弥尔顿(共24讲) http://www.manfen.net/thread-9195-1-1.html 耶鲁大学开放课:天体物理学之探索和争议(12讲) http://www.manfen.net/thread-9201-1-1.html 耶鲁大学公开课:解读但丁(24讲) http://manfen.net/thread-10650-1-1.html 耶鲁大学公开课:新生有机化学--32讲 http://www.manfen.net/thread-10689-1-1.html 斯坦福大学 斯坦福大学开放课程 : 傅立叶变换及应用 http://www.manfen.net/thread-6834-1-1.html 斯坦福大学开放课程: 抽象编程 http://www.manfen.net/thread-6822-1-1.html 斯坦福大学公开课:7个颠覆你思想的演讲 http://www.manfen.net/thread-7883-1-1.html 斯坦福大学开放课程-工程学科:机器人学 http://www.manfen.net/thread-9146-1-1.html 斯坦福大学开放课程-编程方法论 http://www.manfen.net/thread-9148-1-1.html 斯坦福大学开放课程:量子力学 http://www.manfen.net/thread-7954-1-1.html 斯坦福大学公开课:商业领袖和企业家 http://www.manfen.net/thread-8051-1-1.html 麻省理工大学 MIT linear algebra http://www.manfen.net/thread-7072-1-1.html MIT physics classes http://www.manfen.net/thread-7065-1-1.html MIT OpenCourseWare -- Calculus http://www.manfen.net/thread-7052-1-1.html Applied Functional Analysis(应用泛函分析) http://www.manfen.net/thread-7051-1-1.html 美国麻省理工大学(MIT)--大学物理本科教学录像. http://www.manfen.net/thread-7047-1-1.html 麻省理工大学开放课:建筑设计(共12讲) http://www.manfen.net/thread-9198-1-1.html 麻省理工大学开放课:经典力学(35讲) http://www.manfen.net/thread-9200-1-1.html 麻省理工大学公开课:音乐的各种声音 http://www.manfen.net/thread-10683-1-1.html 普林斯顿大学 普林斯顿大学公开课:国际座谈会 http://www.manfen.net/thread-7945-1-1.html 普林斯顿大学开放课程:领导能力简介 http://www.manfen.net/thread-7952-1-1.html 普林斯顿大学开放课程:自由意志定理 http://www.manfen.net/thread-7953-1-1.html 普林斯顿大学开放课程:人性 http://www.manfen.net/thread-7884-1-1.html 加大及其分校 美国加州艺术学院讲座设计和工艺 Paul.Discoe.Lecture http://www.manfen.net/thread-7223-1-1.html 美国加州艺术学院讲座:设计和工艺 Jennifer.Broutin.and.Carmen.Trud http://www.manfen.net/thread-7222-1-1.html 美国加州艺术学院讲座:时尚设计 http://www.manfen.net/thread-7221-1-1.html 加大伯克利分校开放课程-操作系统和编程 http://www.manfen.net/thread-9150-1-1.html 加大洛杉矶分校-家庭与夫妇心理学:亲密的关系 http://www.manfen.net/thread-9141-1-1.html 加州伯克利大学公开课:数据统计分析--42 http://manfen.net/thread-10656-1-1.html 加州伯克利大学公开课:社会认知心理学--25 http://www.manfen.net/thread-10672-1-1.html 加州伯克利大学公开课:世界各地人民和国家--共19 http://www.manfen.net/thread-10671-1-1.html 加州伯克利大学公开课:大灾难时期的伦理和公共健康--共14 http://www.manfen.net/thread-10669-1-1.html 加州伯克利大学公开课:综合生物学--39 http://www.manfen.net/thread-10679-1-1.html 牛津大学 牛津大学公开课:《尼采的心灵与自然》 http://manfen.net/thread-10652-1-1.html 牛津大学公开课:《哲学概论》--17 http://manfen.net/thread-10653-1-1.html 剑桥大学 剑桥大学公开课:《人类学》--15 http://www.manfen.net/thread-10684-1-1.html 其它学校 美国名校人文社科lecture http://www.manfen.net/thread-7097-1-1.html 更多公开课请访问:http://www.manfen.net/topic-public-class.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值