栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct { int data; struct Stack *next; } Stack; /** * 初始化链表 * @param S */ void InitList(Stack **S) { //申请头节点 Stack *p = (Stack *) malloc(sizeof(Stack)); if (p == NULL) { printf("%s函数执行,申请内存失败\n", __FUNCTION__); } *S = p; }; /** * 获取输入值 * @param list */ void GetInput(Stack *list) { Stack *temp = list; printf("请输入值\n"); temp->next = NULL; scanf("%d", &temp->data); } /** * 创建节点 * @param list */ void CreateNode(Stack **list) { Stack *temp = (Stack *) malloc(sizeof(Stack)); if (temp == NULL) { printf("%s函数执行,申请内存失败\n", __FUNCTION__); } GetInput(temp); *list = temp; } /** * 入栈 * @param S * @return */ _Bool Push(Stack *S) { Stack *temp = NULL; CreateNode(&temp); temp->next = S->next; S->next = temp; return true; } /** * 出栈 * @param S * @return */ _Bool Pop(Stack *S) { if (S->next == NULL) { printf("空栈 \n"); return false; } Stack *temp = NULL; temp = S->next; S->next = temp->next; free(temp); return true; } /** * 获取栈顶元素 * @param S * @return */ _Bool GetTop(Stack *S) { if (S->next == NULL) { printf("空栈 \n"); return false; } Stack *temp = NULL; temp = S->next; printf("栈顶的值为:%d \n", temp->data); return true; } /** * 打印栈内所有内容 * @param list */ void PrintList(Stack *list) { Stack *temp = list; if (temp == NULL) { printf("%s函数执行,链表为空\n", __FUNCTION__); } else { while (temp->next) { temp = temp->next; printf("栈内元素的值为:%d \n", temp->data); } } putchar('\n'); } int main() { Stack *s; InitList(&s); Push(s); Push(s); PrintList(s); GetTop(s); Pop(s); Pop(s); GetTop(s); Pop(s); return 0; }