栈(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,模板类的更多相关文章

  1. 为什么说在js当中所有类的父类是Object类

    代码如下所示: function Parent(add,net,no,teacher) { this.add = add; this.net = net; this.no = no; this.tea ...

  2. 《数据结构与STL-第二章 线性表》读书笔记

    线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...

  3. 顺序表(SeqList)

    ---恢复内容开始--- 数据结构在上周结课,接下来就是为期几周的上机实验,说是实验课我感觉还不如不上.几乎每个人都是按着老师的要求把书上的代码打一遍,变都不变.一遍以后连自己打的什么都不知道. 与其 ...

  4. ListNode线性表

    不常用,可以看一下实现原理 namespace UnilateralismChainTable { // 结点类 public class ListNode { public ListNode(int ...

  5. 开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  6. JAVA迭代器学习--在JAVA中实现线性表的迭代器

    1,迭代器是能够对数据结构如集合(ADT的实现)进行遍历的对象.在遍历过程中,可以查看.修改.添加以及删除元素,这是它与一般的采用循环来遍历集合中的元素不同的地方.因为,通常用循环进行的遍历操作一般是 ...

  7. C++类模板和模板类

    C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...

  8. (转)JDBC模板类。

    Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTempl ...

  9. java——线性表接口实现

    线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...

随机推荐

  1. 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 ...

  2. sublime package control INSTALLATION

    Simple The simplest method of installation is through the Sublime Text console. The console is acces ...

  3. HTTP长连接、短连接究竟是什么?

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  4. bootstrap-select——Methods

    参考资料:http://silviomoreto.github.io/bootstrap-select/methods/ Methods .selectpicker('val'):通过调用元素的val ...

  5. CSP中的选择

    P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...

  6. (20)gevent协程

    协程: 也叫纤程,协程是线程的一种实现,指的是一条线程能够在多任务之间来回切换的一 种实现,对于CPU.操作系统来说,协程并不存在 任务之间的切换会花费时间.目前电脑配置一般线程开到200会阻塞卡顿 ...

  7. Family 科

    拉丁语 familia 目--> 总科-->科-->亚科(亚科的拉丁文分类滋味通常是-inae) [族] 属

  8. JVM垃圾回收(一)- 什么是垃圾回收

    什么是垃圾回收? 垃圾回收是追踪所有正在被使用的对象,并标注剩余的为garbage.这里我们先从JVM的GC是如何实现的说起. 手动内存管理 在开始介绍垃圾回收之前,我们先复习一下手动内存管理.它是指 ...

  9. 广工十四届校赛 count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...

  10. for each...in

    for each...in 使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. for each...in 是 ECMA-357 (E4X) 标准的一部分, 大部分非M ...