剑指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
作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)