线性表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——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
随机推荐
- 《CSS世界》读书笔记(七)
<!-- <CSS世界> 张鑫旭著 --> 替换元素 根据是否具有可替换内容,我们可以把元素分为替换元素和非替换元素. <img>.<object>.& ...
- 简单的sql server->bs或cs数据交互模式
主要记录工作当中遇到的一些问题和总结的一些经验 客户端请求-->web服务接口-->sql 语句执行(存储在数据库中)-->web服务(客户端通过调用web服务接口)-->返回 ...
- iptables 最终 第四章
转发 ,NAT 功能 Chain FORWARD 开启网卡转发功能: /proc/sys/net/ipv4/ip_forward #使用sysctl 开启内核转发功能 sysctl - 核心转发: / ...
- 安装GDB-ImageWatch ,在QT中查看图像
GDB_ImageWatch是在Linux下基于QT编写图像处理程序的调试程序. 由于并非像ImageWatch一样由官方提供,而是在github上以代码的方式进行提供,我们在使用的时候需要自己编译, ...
- 【2.0】使用默认日志slf4j配置
一.SpringBoot日志简介 SpringBoot使用Commons Logging进行所有内部日志记录,但底层日志实现保持开放状态.为Java Util Logging,Log4j2和Logba ...
- 关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)
概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等.在ComponentOne For ...
- 更改redhat7 yum源为centos
1. 替换原系统中yum包, 检查初始的yum包有哪些 rpm -qa |grep yum 2. 删除原始的yum包. rpm -qa|grep yum|xargs rpm -e --nodeps 3 ...
- Angular 学习笔记 (Material Select and AutoComplete)
记入一些思考 : 这 2 个组件有点像,经常会搞混. select 的定位是选择. 目前 select 最糟糕的一点是 not search friendly. 还有当需要 multiple sele ...
- try与except处理异常语句
ji 简介 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测, ...
- Openstack官网文档简介
OpenStack documentation相关文档见 docs.openstack.org. 主要包含这些方面的文档: Installation Guides Deployment Guides ...