线性表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——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
随机推荐
- Java 实现异步调用
首先 我遇到的问题是 接口调用时需要更新缓存 而更新缓存又是个说快不快的过程 所以打算做异步调用 返回我所需要的结果即可 ,至于缓存什么时候更新完 就不是我所需要关注的了 废话不多说 上代码 publ ...
- 20190402 管道符,分号,单引号,双引号,&&的使用
:分号叫顺序执行 格式:命令:命令 && :前一条命令执行成功,后面命令继续执行:前面命令执行失败,后者不执行 格式:命令+空格&&空格+命令 || :两管道逻辑执行, ...
- 微信小程序一些demo链接地址
校园小情书小程序前端+后端源码 https://www.douban.com/group/topic/116974400/ 小程序源码疯狂猜成语小程序源码UI美观 https://www.douban ...
- 一个关于cookie的坑
#问题:今天上午踩了一个坑,首先,这个小案例的运行结果是应该是在前端页面出现一个当前时间的,当然如果是首次登陆的话应该是显示"第一次登陆",第二次则会显示上次的登录时间,但是却没有 ...
- 破解网页右键被禁止js
按F12,点击console输入一下内容后按回车 javascript:alert(document.onselectstart = document.oncontextmenu= document. ...
- day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm
复习 重点: 1.进制转换:二进制 与十六进制 2.内存分布:栈区 与堆区 # 二进制1111转换十六进制 => 8 4 2 1 => f 10101100111011 => 2a7 ...
- 新建Maven项目建成后本应该有的src/main/java和src/test/java目录并没有出现:
转自:http://www.cnblogs.com/dong-dong-dong/p/9565466.html 新建Maven项目建成后本应该有的src/main/java和src/test/java ...
- (转载)Unity 关于动态监听时,点击Button,返回其在数组中的下标
其实是绕了一圈,把数组里的元素放进数组列表里再读取它的下标 using System.Collections; using System.Collections.Generic; using Unit ...
- vuejs点滴
博客0.没事的时候可以看的一些博客:https://segmentfault.com/a/1190000005832164 http://www.tuicool.com/articles/vQBbii ...
- (15)线程---Condition条件
功能:也是通过阻塞控制线程数量.类似信号量\进程池\线程池的作用 语法:wait from threading import Condition con= Condition() conn.acq ...