打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
剑指offer之用链表实现栈(带头节点)

1 问题

用链表实现栈,栈先进后出.

2 代码实现

#include <stdio.h>
#include <stdlib.h>

#define true 1
#define false 0

typedef struct Node
{
    int value;
    struct Node *next;
} Stack;


/*
 *打印栈
 */
void print(Stack *stack)
{
    if (stack == NULL)
    {
        printf("stack is NULL\n");
        return;
    }
    struct Node *p = stack->next;
    while (p != NULL)
    {
        printf("value is: %d\n", p->value);
        p = p->next;
    }
    return;
}


/**
 *给栈添加一个节点
 */
int add_node(Stack *stack, int value)
{
    if (stack == NULL)
    {
        printf("stack is NULL\n");
        return false;
    }
    struct Node *node = NULL;
    node = (struct Node *)malloc(sizeof(struct Node));
    if (node == NULL)
    {
        printf("addNode malloc fail\n");
        return false;
    }
    node->value = value;
    node->next = stack->next;
    stack->next = node;
    return true;
}


/*
 *初始化栈
 */
struct Node* init()
{
    struct Node *head = NULL;
    head = (struct Node *)malloc(sizeof(struct Node));
    if (head == NULL)
    {
        return NULL;
    }
    head->next = NULL;
    head->value = 0;
    return head;
}


/*
 *打印栈的大小
 */
int size_stack(Stack *stack)
{
    if (stack == NULL)
    {
        return 0;
    }
    Stack *head = stack->next;
    int size = 0;
    while (head != NULL)
    {
        ++size;
        head = head->next;
    }
    return size;
}
  

/*
 *弹出栈顶元素
 */
int pop_stack(Stack *stack)
{
    if (stack == NULL)
    {
        printf("stack is NULL");
        return false;
    }
    struct Node *p = stack->next;
    if (p == NULL)
    {
        printf("stack->next is NULL");
        return false;
    }
    stack->next = p->next;
    free(p);
    return true;
}

/*
 *获取栈顶元素
 */
struct Node* top_stack(Stack *stack)
{
    /**if (stack == NULL);这里自己傻逼了,多加了一个分号导致程序走到里面
    {
        printf("stack1 is NULL\n");
        return NULL;
    }**/
    if (stack == NULL)
    {
        printf("stack is is is NULL\n");
        return NULL;
    }
    struct Node *p = stack->next;
    if (p == NULL)
    {
        printf("stack->next is NULL");
        return NULL;
    }
    return p;
}

void clear_stack(Stack *stack)
{
    if (stack == NULL)
    {
        return;
    }
    struct Node *q, *p = stack->next;
    while(p != NULL)
    {
        q = p;
        p = p->next;
        free(q);
    }
    stack->next = NULL;
}


int main()
{

    struct Node *head = init();
    if (head == NULL)
    {
        printf("init stack fail\n");
        return false;
    }
    printf("init success\n");
    add_node(head, 1);
    add_node(head, 2);
    add_node(head, 5);
    add_node(head, 4);
    add_node(head, 3);
    print(head);
    struct Node* top = top_stack(head);
    if (top != NULL)
    {
        printf("top value is %d\n", top->value);
    }
    printf("stack size is %d\n", size_stack(head));
    int result = pop_stack(head);
    if (result == true)
    {
        printf("pop_stack success\n");
    }
    else
    {
        printf("pop_stack fail\n");
    }
    print(head);
    printf("stack size is %d\n", size_stack(head));
    clear_stack(head);
    if (head == NULL)
    {
        printf("head is NULL\n");
    }
    printf("stack size is %d\n", size_stack(head));
    head = init();
    if (head == NULL)
    {
        printf("init stack fail\n");
        return false;
    }
    printf("init success\n");
    add_node(head, 6);
    add_node(head, 5);
    add_node(head, 2);
    add_node(head, 1);
    add_node(head, 9);
    print(head);
    printf("stack size is %d\n", size_stack(head));
    return true;
}
   

3 运行结果

init success
value is: 3
value is: 4
value is: 5
value is: 2
value is: 1
top value is 3
stack size is 5
pop_stack success
value is: 4
value is: 5
value is: 2
value is: 1
stack size is 4
stack size is 0
init success
value is: 9
value is: 1
value is: 2
value is: 5
value is: 6
stack size is 5
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[C++面试题]之循环链表、队列、栈和堆(在csdn上看到一道面试题—求解啊)
学习心得:C语言实现链表的操作(超详细,附学习资料)
一步一步教你从零开始写C语言链表——构建一个链表
数据结构学习2——单链表
【数据结构】C语言实现链表的创建及遍历链表
C语言 实现链表
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服