目录

  • 1 课程资料
    • 1.1 课程标准
    • 1.2 教学日历
    • 1.3 说课课件
  • 2 第一章绪论
    • 2.1 本章教学目标
    • 2.2 数据结构简介
    • 2.3 数据结构类型
    • 2.4 算法分析
    • 2.5 本章讲义
    • 2.6 本章测验题
    • 2.7 测验
  • 3 线性结构
    • 3.1 本章教学目标
    • 3.2 线性表
    • 3.3 线性表的顺序存储及运算实现
      • 3.3.1 本节讲义
    • 3.4 线性表的链式存储和 运算实现
      • 3.4.1 本节讲义
    • 3.5 应用
    • 3.6 数组
      • 3.6.1 讲义
    • 3.7 本章测验题
    • 3.8 测验
    • 3.9 作业
  • 4 第三章栈和队列
    • 4.1 本章教学目标
    • 4.2 第一课时栈
      • 4.2.1 讲义
    • 4.3 第二课时队列
      • 4.3.1 讲义
    • 4.4 应用
      • 4.4.1 讲义
    • 4.5 本章测验题
  • 5 第四章串
    • 5.1 第一课时概念
    • 5.2 本章学习目标
    • 5.3 本章测验题
  • 6 第五章树和二叉树
    • 6.1 本章学习目标
    • 6.2 第一课时树的定义及基本术语
    • 6.3 第二课时二叉树定义性质存储
    • 6.4 第三课时二叉树遍历
    • 6.5 第四二叉排序与平衡二叉树
    • 6.6 第五树森林二叉树之间转换
    • 6.7 第六课时哈夫曼树
    • 6.8 本章测验题
    • 6.9 测验
    • 6.10 作业
  • 7 第六章图
    • 7.1 本章学习目标
    • 7.2 第一课时图的基本概念
    • 7.3 第二课时图的存储
    • 7.4 第三课时图的遍历
    • 7.5 第四课时最小生成树
    • 7.6 第五课时最短路径
    • 7.7 第六课时拓扑排序
    • 7.8 第七课时关键路程
    • 7.9 本章测验题
    • 7.10 测验
    • 7.11 作业
  • 8 第七章查找
    • 8.1 本章学习目标
    • 8.2 第一课时顺序查找二分查找
    • 8.3 第二课时哈希表
    • 8.4 本章测验题
    • 8.5 测验
    • 8.6 作业
  • 9 第八章排序
    • 9.1 本章学习目标
    • 9.2 第一课时基本概念
    • 9.3 第二课时插入选择排序
    • 9.4 第三课时交换排序
    • 9.5 第四课时归并 基排序及比较
    • 9.6 本章测验题
    • 9.7 测验
    • 9.8 作业
第一课时栈


掌握栈的类型定义

掌握栈的顺序表示和实现

通常称,栈和队列是限定插入和删除只能在表的“端点”进行的线性表。

栈(Stack是限定只能在表尾进行插入和删除操作的线性表。

表中进行插入、删除操作的一端称为栈顶top)(表尾),栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底bottom)(表头)。

当栈中没有数据元素时称为空栈;向一个栈插入元素又称为进栈入栈;从一个栈中删除元素又称为出栈退栈

栈和队列都是线性数据结构

栈:后进先出

队列:先进先出

3.1 栈的类型定义

ADT Stack {

      数据对象

         D{ ai | ai ElemSet, i=1,2,...,n,  n0 }

      数据关系

         R1{ <ai-1, ai >| ai-1, aiD, i=2,...,n }

      基本操作:

} ADT Stack

栈的顺序存储实现

顺序栈是使用顺序存储结构实现的堆栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。同时附设指针top指示栈顶元素在顺序栈中的位置。以top=0表示空栈。

根据数组操作的特性,选择数组下标大的一端,即线性表顺序存储的表尾来作为栈顶。

//----- 栈的顺序存储表示 -----

  #define  STACK_INIT_SIZE  100;

  #define  STACKINCREMENT   10;  

  typedef struct {

    SElemType  *base; //basenull表示栈不存在   

    SElemType  *top;  // top=base表示栈空

    int  stacksize;    

  } SqStack;

Status InitStack (SqStack &S)

{// 构造一个空栈S

  S.base=(ElemType*)malloc(STACK_INIT_SIZE*

                                         sizeof(ElemType));

   if (!S.base) exit (OVERFLOW); //存储分配失败

   S.top = S.base;

   S.stacksize = STACK_INIT_SIZE;

   return OK;

}

Status Push (SqStack &S, SElemType e) {

   if (S.top - S.base >= S.stacksize) {      S.base = (ElemType *) realloc ( S.base, (S.stacksize + STACKINCREMENT) * 

                                                   sizeof (ElemType));

       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;

    e = *--S.top;

    return OK;

}


例一、 数制转换

void conversion () {

    InitStack(S);

    scanf ("%d",N);

    while (N) {

      Push(S, N % 8);

      N = N/8;

    }

    while (!StackEmpty(S)) {

      Pop(S,e);

      printf ( "%d", e );

    }

} // conversion

例二、 括号匹配的检验

Status matching(string& exp) {

  int state = 1;

  while (i<=Length(exp) && state) {

     switch of exp[i] {

       case 左括弧:{Push(S,exp[i]); i++; break;}

       case”)”: {

          if(NOT StackEmpty(S)&&GetTop(S)=“(“

            {Pop(S,e);  ii++;}

          else {state = 0;}

          break;  }   … …

  }

例三、行编辑程序问题

while (ch != EOF) { //EOF为全文结束符

while (ch != EOF && ch != '\n') {

      switch (ch) {

       case '#' : Pop(S, c); break;

       case '@': ClearStack(S); break;// 重置S为空栈

       default : Push(S, ch);  break;  

      }

      ch = getchar();  // 从终端接收下一个字符

    }

将从栈底到栈顶的字符传送至调用过程的

数据区;

ClearStack(S);      // 重置S为空栈

if (ch != EOF)  ch = getchar();

例四 表达式求值

void transform(char suffix[ ], char exp[ ] ) {

  InitStack(S);  Push(S, ¢#¢);

  p = exp;  ch = *p;

  while (!StackEmpty(S)) {


      if (!IN(ch, OP)) Pass( Suffix, ch);

      else {            }

      if ( ch!= ¢#¢ ) { p++;  ch = *p; }

      else { Pop(S, ch);  Pass(Suffix, ch); }

  } // while

} // CrtExptree

switch (ch) {

   case ¢(¢ :  Push(S, ch); break;

   case ¢)¢ :  Pop(S, c);

                    while (c!= ¢(¢ )

                       { Pass( Suffix, c);  Pop(S, c) }

                    break;

    defult  :

       while(Gettop(S, c) && ( precede(c,ch)))

          { Pass( Suffix, c);  Pop(S, c); }

       if ( ch!= ¢#¢ )  Push( S, ch);

       break;  

} // switch