剑指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
(0)

相关推荐