线性表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——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
随机推荐
- Linux 安装vsftpd和ftp客户端
1.下载安装包:ftp-0.17-54.el6.x86_64.zip和vsftpd-2.2.2-11.el6_4.1.x86_64.zip 可以直接在Linux底下用yum install vsftp ...
- sublime package control INSTALLATION
Simple The simplest method of installation is through the Sublime Text console. The console is acces ...
- HTTP长连接、短连接究竟是什么?
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- bootstrap-select——Methods
参考资料:http://silviomoreto.github.io/bootstrap-select/methods/ Methods .selectpicker('val'):通过调用元素的val ...
- CSP中的选择
P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...
- (20)gevent协程
协程: 也叫纤程,协程是线程的一种实现,指的是一条线程能够在多任务之间来回切换的一 种实现,对于CPU.操作系统来说,协程并不存在 任务之间的切换会花费时间.目前电脑配置一般线程开到200会阻塞卡顿 ...
- Family 科
拉丁语 familia 目--> 总科-->科-->亚科(亚科的拉丁文分类滋味通常是-inae) [族] 属
- JVM垃圾回收(一)- 什么是垃圾回收
什么是垃圾回收? 垃圾回收是追踪所有正在被使用的对象,并标注剩余的为garbage.这里我们先从JVM的GC是如何实现的说起. 手动内存管理 在开始介绍垃圾回收之前,我们先复习一下手动内存管理.它是指 ...
- 广工十四届校赛 count 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...
- for each...in
for each...in 使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. for each...in 是 ECMA-357 (E4X) 标准的一部分, 大部分非M ...