数据结构入门:用队列实现栈(补充理解结构体、calloc等)

  • 补充定义:结构体,就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。
  • 定义结构体并初始化:
/struct 前面加上typedef,表示以后声明这个类型就不用前面加上struct。直接使用别名就可以。
 (typedef) struct stuff{
        char job[20];
        int age;
        float height;
}Huqinwei;
  • malloc、calloc、realloc的区别:
    (1)函数malloc()不能初始化所分配的内存空间 ;
    (2)函数calloc()会将所分配的内存空间中的每一位都初始化为零 ;
    (3)函数realloc()可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变.当然,对于缩小,则被缩小的那一部分的内容会丢失.realloc并不保证调整后的内存空间和原来的内存空间保持同一内存地址.相反,realloc返回的指针很可能指向一个新的地址.
  • 前面我们已经说过,栈一般用数组实现较优,队列一般用链表实现较优,所以用队列实现栈,就是让我们最好以链表的方式实现栈:
/结构体构造结点
typedef struct MyListNode{
    struct MyListNode* next;
    /指向下一个结点的指针,下一个结点的类型也为MyListNode结构体
    int val;
}ListNode;

typedef struct Stack{
     ListNode* top;
} MyStack;

/初始化栈
MyStack* myStackCreate() {
    MyStack* st = calloc(1,sizeof(MyStack));
    return st;
}

/top始终指向栈顶,为链表插入和删除的一端
void myStackPush(MyStack* obj, int x) {
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->next = obj->top;
    node->val = x;
    obj->top = node;
}

int myStackPop(MyStack* obj) {
    ListNode* node = obj->top;
    int pop = node->val;
    obj->top = node->next;
    free(node);
    return pop;
}

bool myStackEmpty(MyStack* obj) {
    if(obj->top == NULL)
        return true;
    else
        return false;
}

void myStackFree(MyStack* obj) {
        while (obj->top != NULL) {
        ListNode* node = obj->top;
        obj->top = node->next;
        free(node);
    }
    free(obj);
}

你可能感兴趣的:(数据结构入门:用队列实现栈(补充理解结构体、calloc等))