栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。通常称其表尾为栈顶(top),表头端称为栈底( bottom)。按栈的存储方式可以分为顺序栈、链式栈。

  一、顺序表栈

  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. #define OVERFLOW -1
  5. #define OK 1
  6. #define ERROR 0
  7. #define STACK_INIT_SIZE 100 //存储空间初始分配量
  8. #define STACKINCREMENT 10//存储空间分配增量
  9.  
  10. typedef int SElemType,Status;
  11. /* 顺序栈结构体 */
  12. typedef struct {
  13. SElemType *base; //栈底指针
  14. SElemType *top; //栈顶指针
  15. int stacksize;
  16. }SqStack;
  17.  
  18. /* 构造一个空栈 */
  19. Status InitStack (SqStack &S ){
  20. S.base = (SElemType*) malloc(STACK_INIT_SIZE*sizeof (SElemType));
  21. if (! S.base) exit(OVERFLOW);//存储分配失败
  22. S.top =S.base;
  23. S.stacksize = STACK_INIT_SIZE;
  24. return OK;
  25. }
  26.  
  27. /* 返回栈顶元素 */
  28. Status GetTop (SqStack S , SElemType &e )
  29. {
  30. if(S.top == S.base) return ERROR;//栈空 top == base
  31. e = *(S.top-); //top指向的是栈顶元素的下一个位置
  32. return OK;
  33. }
  34.  
  35. /* 压栈(插入元素) */
  36. Status Push (SqStack &S , SElemType e )
  37. {
  38. if(S.top - S.base >= S.stacksize)//栈满
  39. { //当前存储空间已满,增加分配
  40. S.base = (SElemType *)realloc(S.base,
  41. (S.stacksize+STACKINCREMENT)*sizeof (SElemType));
  42. if (!S.base) exit(OVERFLOW);// 存储分配失败
  43. S.top = S.base + S.stacksize;//更新栈顶
  44. S.stacksize+= STACKINCREMENT; //增加存储容量
  45. }
  46. *S.top++ = e;//压栈并更新栈顶
  47. return OK;
  48. }
  49.  
  50. /* 出栈(删除栈顶元素) */
  51. Status Pop (SqStack &S , SElemType &e )
  52. {
  53. if(S.top == S.base) return ERROR;//栈空 top == base
  54. e = *--S.top; //更新栈顶并出栈
  55. return OK;
  56. }
  57.  
  58. /* 测试 */
  59. int main()
  60. {
  61. SqStack S;
  62. SElemType e;
  63. InitStack(S);//构造空栈
  64. for(int i=; i<; ++i)
  65. Push(S,i); //压栈
  66. while(Pop(S,e))
  67. printf("%d\n",e);//出栈
  68. return ;
  69. }
  1. //浙大数据结构 \ 顺序栈
  2. typedef int Position;
  3. struct SNode {
  4. ElementType *Data; /* 存储元素的数组 */
  5. Position Top; /* 栈顶指针 */
  6. int MaxSize; /* 堆栈最大容量 */
  7. };
  8. typedef struct SNode *Stack;
  9.  
  10. Stack CreateStack( int MaxSize )
  11. {
  12. Stack S = (Stack)malloc(sizeof(struct SNode));
  13. S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
  14. S->Top = -;
  15. S->MaxSize = MaxSize;
  16. return S;
  17. }
  18.  
  19. bool IsFull( Stack S )
  20. {
  21. return (S->Top == S->MaxSize-);
  22. }
  23.  
  24. bool Push( Stack S, ElementType X )
  25. {
  26. if ( IsFull(S) ) {
  27. printf("堆栈满");
  28. return false;
  29. }
  30. else {
  31. S->Data[++(S->Top)] = X;
  32. return true;
  33. }
  34. }
  35.  
  36. bool IsEmpty( Stack S )
  37. {
  38. return (S->Top == -);
  39. }
  40.  
  41. ElementType Pop( Stack S )
  42. {
  43. if ( IsEmpty(S) ) {
  44. printf("堆栈空");
  45. return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
  46. }
  47. else
  48. return ( S->Data[(S->Top)--] );
  49. }

  二、链表栈

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define OK 1
  4. #define ERROR 0
  5. /* 0.定义结点 */
  6. typedef int SElemType, Status;
  7. typedef struct stack* STACKPTR;
  8. typedef struct stack STACK;
  9. struct stack{
  10. SElemType e;
  11. STACKPTR next;
  12. };
  13.  
  14. /* 1.push */
  15. Status push(STACKPTR *top,SElemType e)
  16. {
  17. STACKPTR p;
  18. p = (STACKPTR)malloc(sizeof(STACK));
  19. if(p == NULL)
  20. return ERROR;
  21.  
  22. p->e=e;
  23. p->next = *top;
  24.  
  25. *top = p;
  26. return OK;
  27. }
  28.  
  29. /* 2.pop */
  30. Status pop(STACKPTR *top,SElemType *e)
  31. {
  32. if(*top == NULL)
  33. return ERROR;
  34.  
  35. *e = (*top)->e;
  36.  
  37. STACKPTR t = *top;
  38. *top = (*top)->next;
  39. free(t);
  40. return OK;
  41. }
  42.  
  43. /* 测试代码 */
  44. int main()
  45. {
  46. STACKPTR top = NULL;
  47. SElemType e;
  48. for(int i=; i<; ++i)
  49. push(&top,i);
  50. while(pop(&top,&e))
  51. printf("%d\n",e);
  52. return ;
  53. }
  1. //浙大数据结构 \ 链栈
  2. typedef struct SNode *PtrToSNode;
  3. struct SNode {
  4. ElementType Data;
  5. PtrToSNode Next;
  6. };
  7. typedef PtrToSNode Stack;
  8.  
  9. Stack CreateStack( )
  10. { /* 构建一个堆栈的头结点,返回该结点指针 */
  11. Stack S;
  12.  
  13. S = (Stack)malloc(sizeof(struct SNode));
  14. S->Next = NULL;
  15. return S;
  16. }
  17.  
  18. bool IsEmpty ( Stack S )
  19. { /* 判断堆栈S是否为空,若是返回true;否则返回false */
  20. return ( S->Next == NULL );
  21. }
  22.  
  23. bool Push( Stack S, ElementType X )
  24. { /* 将元素X压入堆栈S */
  25. PtrToSNode TmpCell;
  26.  
  27. TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
  28. TmpCell->Data = X;
  29. TmpCell->Next = S->Next;
  30. S->Next = TmpCell;
  31. return true;
  32. }
  33.  
  34. ElementType Pop( Stack S )
  35. { /* 删除并返回堆栈S的栈顶元素 */
  36. PtrToSNode FirstCell;
  37. ElementType TopElem;
  38.  
  39. if( IsEmpty(S) ) {
  40. printf("堆栈空");
  41. return ERROR;
  42. }
  43. else {
  44. FirstCell = S->Next;
  45. TopElem = FirstCell->Data;
  46. S->Next = FirstCell->Next;
  47. free(FirstCell);
  48. return TopElem;
  49. }
  50. }

  三、栈的应用举例

  1、进制转换

  十进制数N和其它d进制数的转换的算法基于原理: N = (N div d)×d + N mod d, 其中,div 相除取整,mod 相除取余。

  计算过程是从低位到高位顺序产生d进制数的各个数位,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的d进制数 的各位顺序进栈,则按出栈序列打印输出的即为与输入对应 的d进制数。

  1. /* 用上面链表栈代码测试 */
  2. STACKPTR top = NULL;
  3. SElemType e;
  4. int n = ;//10进制数
  5. int d = ; //8进制
  6. while(n)
  7. {
  8. push(&top,n%d);
  9. n /= d;
  10. }
  11. while(pop(&top,&e))
  12. 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. axios的封装

    function axios(options){ var promise = new Promise((resolve,reject)=>{ var xhr = null; if(window. ...

  2. 输出UTF-8-BOM格式的文件

    File localDir = new File(localPath); if(!localDir.exists()){ localDir.mkdirs(); } File file = new Fi ...

  3. scp传输文件,自动填充密码

    一个偷懒的小shell, #!/usr/bin/expect #******************************************************************** ...

  4. https连接器

    非对称性加密:A生成一份公私钥,将公钥交给需要进行数据传输的B,B发送数据时先用公钥对数据进行加密,然后发送给A,再由A使用私钥进行解密. 但存在漏洞即B如何确认公钥是由A提供的.因此需要一个第三方机 ...

  5. Spring 学习——Spring AOP——AOP配置篇Aspect、Pointcut

    Schena——based AOP 声明 Spring所有的切面和通知器都必须放在一个<aop:config>标签内,可以同时配置多个<aop:config>元素. 每一个&l ...

  6. Java基础学习-注释的概述和分类

    /*     注释:用于解释说明程序的文字          分类:             单行://             多行:/**/       作用:解释说明程序,提高程序的阅读性 */ ...

  7. event.target.dataset

    dataset并不是典型意义上的JavaScript对象,而是个DOMStringMap对象,DOMStringMap是HTML5一种新的含有多个名-值对的交互变量. 1.event.target.d ...

  8. centos6.5下安装tomcat

    linux在安装tomcat之前必须已安装jdk 已下载好tomcat 拖到centos系统的桌面 现在在桌面目录下 mv apache-tomcat-8.5.39.tar.gz /usr/local ...

  9. Perl调用外部命令(其他脚本、系统命令)的方法和区别

    1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值.   2. open LIST "ls -l| ...

  10. spring-data-jpa——如果使用了one-to-many,many-to-one的注解,在Jackson进行json字符串化时出现错误的解决方案

    参考资料: http://blog.csdn.net/remote_roamer/article/details/51330843 http://blog.csdn.net/xiaodaiye/art ...