认识栈

/* 栈的定义: ---栈是一种只能从表的一端存储数据,且遵循“先进后出”原则的"线性存储结构" 1.栈只能从一端(栈顶)取出,另一端(栈底)是封闭的 2.在栈中,都必须从“栈顶”存储数据,且遵循“先进后出”原则 入栈和出栈: 1.入栈:将数据存到栈里面去 2.出栈:将数据从站里面取出来 栈的实现方法: ---栈:“特殊”的线性存储结构 1.顺序表:顺序栈(顺序存储结构) 2.链 表:链 栈(链式存储结构) */
实现顺序栈
# include <stdio.h> /* 1.元素入栈 */ // 参 数:存储结构,栈顶 top,数据 value // 返回值: top int putEle(int* arr, int top, int value) { arr[++top] = value; return top; } /* 2.元素入栈 */ // 参 数:存储结构,栈顶 top // 返回值: top int takeEle(int* arr, int top) { // 先判断 if (top <= -1) { printf("操作失败!空栈!\n"); return -1; } printf("当前出栈元素的值:%d\n", arr[top]); top--; return top; } int main() { // 顺序表:为了理解简单化,我们使用列表 int a[100]; // top (记录栈顶) int top = -1; // 入栈(入5个) top = putEle(a, top, 1); top = putEle(a, top, 2); top = putEle(a, top, 3); top = putEle(a, top, 4); top = putEle(a, top, 5); // 出栈(出6个) top = takeEle(a, top); top = takeEle(a, top); top = takeEle(a, top); top = takeEle(a, top); top = takeEle(a, top); top = takeEle(a, top); return 0; }
实现链栈
/* 链栈: 一般来说,我们将链表的“头结点”作为栈顶,“尾结点”作为栈底,这样的效率高一些(如图所示) 注意事项: “头结点”是不断更新的,即“头结点”永远是“刚进来”的那个 “尾结点”是不会更新的,即“尾结点”永远是“第一个进来”的那个 ---如果用另外一种方式: 头结点”作为栈底,“尾结点”作为栈顶,这种方式,每次新的元素入栈,都要从栈底遍历一遍到栈顶,才能入栈成功 将会遍历很多次,效率非常低下 */

#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* pnext; }Node; // 入栈函数 Node* eleIn(Node* p, int num) { Node* temp = (Node*)malloc(sizeof(Node)); temp->data = num; temp->pnext = p; p=temp; printf("当前进栈元素的值:%d\n", num); return p; } // 出栈函数 Node* eleOut(Node* p) { if (p) { Node* temp = p; printf("当前出栈元素的值:%d\n", temp->data); p = temp->pnext; free(temp); temp = NULL; } else { printf("栈是空的!\n"); } return p; } int main() { Node* p = NULL; // 进栈(5次) p = eleIn(p, 1); p = eleIn(p, 2); p = eleIn(p, 3); p = eleIn(p, 4); p = eleIn(p, 5); printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n"); // 出栈(6次) p = eleOut(p); p = eleOut(p); p = eleOut(p); p = eleOut(p); p = eleOut(p); p = eleOut(p); return 0; }
浙公网安备 33010602011771号