栈的链式实现(C语言)
2016-04-18 20:51
351 查看
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。在表中,允许插入和删除的一端称作“栈顶(top)”,不允许插入和删除的另一端称作“栈底(bottom)”。
通常称往栈顶插入元素的操作为“入栈”,称删除栈顶元素的操作为“出栈”。因为后入栈的元素先于先入栈的元素出栈,故被称为是一种“后进先出”的结构,因此又称 LIFO 表(Last In First Out的缩写)。
和线性表类似,栈也有两种存储表示:顺序栈和链栈。下面仅介绍栈的链式存储实现。
栈的定义:
C++ Code
初始化
C++ Code
入栈
C++ Code
如上图,在入栈两个结点后,栈顶指针指向最新入栈的结点a2,同时结点a2的指针域指向下一个结点,最先入栈的结点指针域为空。
出栈
C++ Code
销毁栈
C++ Code
通常称往栈顶插入元素的操作为“入栈”,称删除栈顶元素的操作为“出栈”。因为后入栈的元素先于先入栈的元素出栈,故被称为是一种“后进先出”的结构,因此又称 LIFO 表(Last In First Out的缩写)。
和线性表类似,栈也有两种存储表示:顺序栈和链栈。下面仅介绍栈的链式存储实现。
栈的定义:
C++ Code
1 2 3 4 5 6 7 8 | typedef struct node //栈的结点结构 { int data; struct node *next; }L,*Link; typedef struct{ //栈顶作链表的头部 Link top; }S,*Stack; |
C++ Code
1 2 3 4 5 6 7 | Stack init_stack() { Stack s; s=(Stack )malloc (sizeof(S )); if(s) s->top =NULL; return s; } |
入栈
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int push_stack(Stack s,int x) { Link p; p=(Link )malloc (sizeof(L)); if(!p) { printf("内存溢出"); return 0; } p->data =x; p->next =s->top ; //将新结点插入到栈顶位置 s->top =p; //栈顶指针指向最新的结点 return 1; } |
如上图,在入栈两个结点后,栈顶指针指向最新入栈的结点a2,同时结点a2的指针域指向下一个结点,最先入栈的结点指针域为空。
出栈
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int pop_stack(Stack s,int &x) { Link p; if(s->top ==NULL) { printf("栈空"); return 0; } x=s->top ->data ; p=s->top ; s->top=s->top ->next ; //出栈后,栈顶指针指向下一个结点 free(p); return 1; } |
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void destroy_stack(Stack &s) { Link p,q; if(s) { p=s->top ; while(p) { q=p; p=p->next ; free(q); } free(s); } s=NULL; return; } |
相关文章推荐
- C++ String写时拷贝(Copy On Write)
- leetcode——链表快排
- 智能指针C++
- Cuda学习笔记(四)——在vs2010中配置.cpp和.cu文件
- 【C++】C++对象内存模型简介
- 串口通信 收发数据
- 使用c++中优先级队列
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgProc(图像处理)
- Minimum Window Substring
- c++语言上机指导实用教程第三章3.1练习4
- c++之引用的本质
- c++实现数组和指针的快速排序
- C/C++易错问题分析
- java和c语言一些数组差别
- C++ WINDOWS API 第2章 Windows API概要
- C++ WINDOWS API 第1章 Windows 应用程序开发入门
- C++ 之 常量成员函数
- leetcode笔记:Power of Four
- C++计算代码片运行时间
- C++冒泡排序