线性表seqList类及其父类list,模板类
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。通常称其表尾为栈顶(top),表头端称为栈底( bottom)。按栈的存储方式可以分为顺序栈、链式栈。
一、顺序表栈
- #include <stdio.h>
- #include <malloc.h>
- #define OVERFLOW -1
- #define OK 1
- #define ERROR 0
- #define STACK_INIT_SIZE 100 //存储空间初始分配量
- #define STACKINCREMENT 10//存储空间分配增量
- typedef int SElemType,Status;
- /* 顺序栈结构体 */
- typedef struct {
- SElemType *base; //栈底指针
- SElemType *top; //栈顶指针
- int stacksize;
- }SqStack;
- /* 构造一个空栈 */
- Status InitStack (SqStack &S ){
- S.base = (SElemType*) malloc(STACK_INIT_SIZE*sizeof (SElemType));
- if (! S.base) exit(OVERFLOW);//存储分配失败
- S.top =S.base;
- S.stacksize = STACK_INIT_SIZE;
- return OK;
- }
- /* 返回栈顶元素 */
- Status GetTop (SqStack S , SElemType &e )
- {
- if(S.top == S.base) return ERROR;//栈空 top == base
- e = *(S.top-); //top指向的是栈顶元素的下一个位置
- return OK;
- }
- /* 压栈(插入元素) */
- Status Push (SqStack &S , SElemType e )
- {
- if(S.top - S.base >= S.stacksize)//栈满
- { //当前存储空间已满,增加分配
- S.base = (SElemType *)realloc(S.base,
- (S.stacksize+STACKINCREMENT)*sizeof (SElemType));
- if (!S.base) exit(OVERFLOW);// 存储分配失败
- S.top = S.base + S.stacksize;//更新栈顶
- S.stacksize+= STACKINCREMENT; //增加存储容量
- }
- *S.top++ = e;//压栈并更新栈顶
- return OK;
- }
- /* 出栈(删除栈顶元素) */
- Status Pop (SqStack &S , SElemType &e )
- {
- if(S.top == S.base) return ERROR;//栈空 top == base
- e = *--S.top; //更新栈顶并出栈
- return OK;
- }
- /* 测试 */
- int main()
- {
- SqStack S;
- SElemType e;
- InitStack(S);//构造空栈
- for(int i=; i<; ++i)
- Push(S,i); //压栈
- while(Pop(S,e))
- printf("%d\n",e);//出栈
- return ;
- }
- //浙大数据结构 \ 顺序栈
- typedef int Position;
- struct SNode {
- ElementType *Data; /* 存储元素的数组 */
- Position Top; /* 栈顶指针 */
- int MaxSize; /* 堆栈最大容量 */
- };
- typedef struct SNode *Stack;
- Stack CreateStack( int MaxSize )
- {
- Stack S = (Stack)malloc(sizeof(struct SNode));
- S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
- S->Top = -;
- S->MaxSize = MaxSize;
- return S;
- }
- bool IsFull( Stack S )
- {
- return (S->Top == S->MaxSize-);
- }
- bool Push( Stack S, ElementType X )
- {
- if ( IsFull(S) ) {
- printf("堆栈满");
- return false;
- }
- else {
- S->Data[++(S->Top)] = X;
- return true;
- }
- }
- bool IsEmpty( Stack S )
- {
- return (S->Top == -);
- }
- ElementType Pop( Stack S )
- {
- if ( IsEmpty(S) ) {
- printf("堆栈空");
- return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
- }
- else
- return ( S->Data[(S->Top)--] );
- }
二、链表栈
- #include <stdio.h>
- #include <malloc.h>
- #define OK 1
- #define ERROR 0
- /* 0.定义结点 */
- typedef int SElemType, Status;
- typedef struct stack* STACKPTR;
- typedef struct stack STACK;
- struct stack{
- SElemType e;
- STACKPTR next;
- };
- /* 1.push */
- Status push(STACKPTR *top,SElemType e)
- {
- STACKPTR p;
- p = (STACKPTR)malloc(sizeof(STACK));
- if(p == NULL)
- return ERROR;
- p->e=e;
- p->next = *top;
- *top = p;
- return OK;
- }
- /* 2.pop */
- Status pop(STACKPTR *top,SElemType *e)
- {
- if(*top == NULL)
- return ERROR;
- *e = (*top)->e;
- STACKPTR t = *top;
- *top = (*top)->next;
- free(t);
- return OK;
- }
- /* 测试代码 */
- int main()
- {
- STACKPTR top = NULL;
- SElemType e;
- for(int i=; i<; ++i)
- push(&top,i);
- while(pop(&top,&e))
- printf("%d\n",e);
- return ;
- }
- //浙大数据结构 \ 链栈
- typedef struct SNode *PtrToSNode;
- struct SNode {
- ElementType Data;
- PtrToSNode Next;
- };
- typedef PtrToSNode Stack;
- Stack CreateStack( )
- { /* 构建一个堆栈的头结点,返回该结点指针 */
- Stack S;
- S = (Stack)malloc(sizeof(struct SNode));
- S->Next = NULL;
- return S;
- }
- bool IsEmpty ( Stack S )
- { /* 判断堆栈S是否为空,若是返回true;否则返回false */
- return ( S->Next == NULL );
- }
- bool Push( Stack S, ElementType X )
- { /* 将元素X压入堆栈S */
- PtrToSNode TmpCell;
- TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
- TmpCell->Data = X;
- TmpCell->Next = S->Next;
- S->Next = TmpCell;
- return true;
- }
- ElementType Pop( Stack S )
- { /* 删除并返回堆栈S的栈顶元素 */
- PtrToSNode FirstCell;
- ElementType TopElem;
- if( IsEmpty(S) ) {
- printf("堆栈空");
- return ERROR;
- }
- else {
- FirstCell = S->Next;
- TopElem = FirstCell->Data;
- S->Next = FirstCell->Next;
- free(FirstCell);
- return TopElem;
- }
- }
三、栈的应用举例
1、进制转换
十进制数N和其它d进制数的转换的算法基于原理: N = (N div d)×d + N mod d, 其中,div 相除取整,mod 相除取余。
计算过程是从低位到高位顺序产生d进制数的各个数位,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的d进制数 的各位顺序进栈,则按出栈序列打印输出的即为与输入对应 的d进制数。
- /* 用上面链表栈代码测试 */
- STACKPTR top = NULL;
- SElemType e;
- int n = ;//10进制数
- int d = ; //8进制
- while(n)
- {
- push(&top,n%d);
- n /= d;
- }
- while(pop(&top,&e))
- printf("%d",e);
线性表seqList类及其父类list,模板类的更多相关文章
- 为什么说在js当中所有类的父类是Object类
代码如下所示: function Parent(add,net,no,teacher) { this.add = add; this.net = net; this.no = no; this.tea ...
- 《数据结构与STL-第二章 线性表》读书笔记
线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...
- 顺序表(SeqList)
---恢复内容开始--- 数据结构在上周结课,接下来就是为期几周的上机实验,说是实验课我感觉还不如不上.几乎每个人都是按着老师的要求把书上的代码打一遍,变都不变.一遍以后连自己打的什么都不知道. 与其 ...
- ListNode线性表
不常用,可以看一下实现原理 namespace UnilateralismChainTable { // 结点类 public class ListNode { public ListNode(int ...
- 开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类
7.2 JDBC模板类 7.2.1 概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...
- JAVA迭代器学习--在JAVA中实现线性表的迭代器
1,迭代器是能够对数据结构如集合(ADT的实现)进行遍历的对象.在遍历过程中,可以查看.修改.添加以及删除元素,这是它与一般的采用循环来遍历集合中的元素不同的地方.因为,通常用循环进行的遍历操作一般是 ...
- C++类模板和模板类
C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...
- (转)JDBC模板类。
Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTempl ...
- java——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
随机推荐
- axios的封装
function axios(options){ var promise = new Promise((resolve,reject)=>{ var xhr = null; if(window. ...
- 输出UTF-8-BOM格式的文件
File localDir = new File(localPath); if(!localDir.exists()){ localDir.mkdirs(); } File file = new Fi ...
- scp传输文件,自动填充密码
一个偷懒的小shell, #!/usr/bin/expect #******************************************************************** ...
- https连接器
非对称性加密:A生成一份公私钥,将公钥交给需要进行数据传输的B,B发送数据时先用公钥对数据进行加密,然后发送给A,再由A使用私钥进行解密. 但存在漏洞即B如何确认公钥是由A提供的.因此需要一个第三方机 ...
- Spring 学习——Spring AOP——AOP配置篇Aspect、Pointcut
Schena——based AOP 声明 Spring所有的切面和通知器都必须放在一个<aop:config>标签内,可以同时配置多个<aop:config>元素. 每一个&l ...
- Java基础学习-注释的概述和分类
/* 注释:用于解释说明程序的文字 分类: 单行:// 多行:/**/ 作用:解释说明程序,提高程序的阅读性 */ ...
- event.target.dataset
dataset并不是典型意义上的JavaScript对象,而是个DOMStringMap对象,DOMStringMap是HTML5一种新的含有多个名-值对的交互变量. 1.event.target.d ...
- centos6.5下安装tomcat
linux在安装tomcat之前必须已安装jdk 已下载好tomcat 拖到centos系统的桌面 现在在桌面目录下 mv apache-tomcat-8.5.39.tar.gz /usr/local ...
- Perl调用外部命令(其他脚本、系统命令)的方法和区别
1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 2. open LIST "ls -l| ...
- spring-data-jpa——如果使用了one-to-many,many-to-one的注解,在Jackson进行json字符串化时出现错误的解决方案
参考资料: http://blog.csdn.net/remote_roamer/article/details/51330843 http://blog.csdn.net/xiaodaiye/art ...