栈(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. 统计随机数及临界值Web Service接口

    (2017-02-04 银河统计) 统计函数API概念   API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发 ...

  2. 新建Maven项目建成后本应该有的src/main/java和src/test/java目录并没有出现:

    转自:http://www.cnblogs.com/dong-dong-dong/p/9565466.html 新建Maven项目建成后本应该有的src/main/java和src/test/java ...

  3. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)

    以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...

  4. 【问题解决:启动卡死】Eclipse启动卡死的解决办法

    问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...

  5. 使用MyBatis Generator 1.3.7自动生成代码

    MyBatis Generator是一款mybatis自动代码生成工具,可以通过配置后自动生成文件. MyBatis Generator有几种方法可以生成代码,下面是其中一种.  一.官网下载 MyB ...

  6. Matlab Code for Visualize the Tracking Results of OTB100 dataset

    Matlab Code for Visualize the Tracking Results of OTB100 dataset 2018-11-12 17:06:21 %把所有tracker的结果画 ...

  7. java中Map集合的常用方法

    Map集合和Collection集合的区别 Map集合是有Key和Value的,Collection集合是只有Value. Collection集合底层也是有Key和Value,只是隐藏起来. V p ...

  8. FI 创建资产接口AS01

    FUNCTION ZREIP_CREATE_AS01TSET. *"------------------------------------------------------------- ...

  9. 常见的Git命令

    最近想着需要把工作中做一个备份,除了本地保存之外,上传到码云是个不错的选择,除了Git的一些特点外,也可以让别人看到你的代码,共同修改之类的 首先在上传到码云之前,需要学习Git的一些基础教程,包括国 ...

  10. VSCode汉化

    1.打开VSCode 点击箭头指示地方  在搜索框中输入chinese 然后安装中文简体 2.按住 Ctrl+shift+p 选择配置显示语言 然后会看见下面的样子 添加 "locale&q ...