2008.09.10数据结构学习笔记

来源:互联网 发布:pplive网络电视直播 编辑:程序博客网 时间:2024/05/20 06:22

/*inc.h*/

#ifndef    _INC_H_
#define    _INC_H_

#define    TRUE        1
#define    FALSE       0
#define    OK          1
#define    ERROR       0
#define    OVERFLOW    (-2)

/*Status是函数的类型,其值是函数结果的状态码*/
typedef    int     Status;

#endif     /*End of _INC_H_*/

 

#include "inc.h"
#include <malloc.h>
#include <stdlib.h>  /*include exit()*/
/*========ADT Stack的表示与实现===========*/

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

#define STACK_INIT_SIZE 100  /*存储空间初始分配量*/
#define STACK_INCREMENT 10      /*存储空间分配增量  */
#define SElemType       int

typedef struct
{
 SElemType *base;             /*在栈构造之前和销毁之后,base的值为NULL*/
 SElemType *top;              /*栈顶指针*/ 
 int       stacksize;         /*当前已分配的存储空间,以元素为单位*/
}SqStack; 

/*---------基本操作的函数原型说明--------*/
Status InitStack    (SqStack *S);                    /*构造一个空栈*/
Status DestroyStack (SqStack *S);                    /*销毁栈S,S不再存在*/
Status ClearStack   (SqStack *S);                    /*把栈S置为空*/
Status StackEmpty   (SqStack  S);                    /*若栈为空,返回TRUE,否则返回FLASE*/
int    StackLength  (SqStack  S);                    /*返回S的元素个数,即栈的长度*/
Status GetTop       (SqStack  S, SElemType *e);      /*若栈不为空,则用e返回S的栈顶元素*/
Status Push         (SqStack *S, SElemType  e);      /*插入元素e为新的栈顶元素*/
Status Pop          (SqStack *S, SElemType *e);      /*若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status StackTraverse(SqStack  S, Status (*visit)(SqStack  S)); /*从栈底到栈顶依次对栈中每个元素调用函数visit(),一旦visit()失败,则操作失败*/

/*---------基本操作的算法描述--------*/
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 ClearStack(SqStack *S)
{
 /*把栈S置为空*/
 if(S->top != S->base)  
    S->top = S->base;
 return OK;   
}

Status GetTop(SqStack S, SElemType *e)
{
    /*若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
 if(S.top == S.base)
  return ERROR;
 *e = *(S.top-1);
 return OK;
}

Status Push(SqStack *S, SElemType e)
{
    /*插入元素e为新的栈顶元素*/
 if((S->top-S->base) >= S->stacksize)
 {
  /*栈满,追加存储空间*/
  S->base = (SElemType*)realloc(S->base,(S->stacksize+STACK_INCREMENT)*sizeof(SElemType));
     if(!S->base)
   exit(OVERFLOW);

  S->top = S->base+S->stacksize;
  S->stacksize += STACK_INCREMENT;  
 }
 *S->top++ = e;
 return OK;
}

Status Pop(SqStack *S, SElemType *e)
{
    /*若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
 if(S->top == S->base)
  exit(OVERFLOW);
 *e = *(--S->top);
 return OK;
}

Status StackTraverse(SqStack  S, Status (*visit)(SqStack  S))
{
 if(S.top == S.base)
  return ERROR;
 visit(S);
 return OK;
}

 

//main.c

#include "SqStack.h"
#include <stdio.h>

void main(void)

 Status visit_print(SqStack  S);
 void   showInput();
 void   LineEdit();
 LineEdit();

 return;
}

void showInput()
{
 printf("root>");
}

void LineEdit()

 /*利用字符栈S,从终端接收一行并传送到调用过程的数据区*/
 char ch;
 SElemType c;
    SqStack S={NULL,NULL,0};
    InitStack(&S);           /*栈造一个空栈*/
 showInput();
 ch = getchar();
 while(ch!=0x21)
 {
  while(ch!='q' && ch!='/n')
  {
   switch(ch)
   {
   case '#':
    Pop(&S,&c);     /*仅当栈非空时退栈*/
    break;  
   case '@':
    ClearStack(&S); /*重置S为空栈*/
    break;
   default:
    Push(&S,ch);    /*有效字符进栈,未考虑栈满情形*/
    break;
   }   
   ch = getchar();  /*从端终接收下一个字符*/
  }
  /*将从栈底到栈顶的栈内字符传送到调用过程的数据区*/
  StackTraverse(S,visit_print);
  ClearStack(&S);         /*重置S为空栈*/
  showInput();
  if(ch!=EOF) ch = getchar();
 }

}

Status visit_print(SqStack  S)
{
 SElemType *pCur = S.base;
 while(pCur != S.top)
 {
        printf("%c",*(pCur++));
 }
 printf("/n");
 return OK;
}

原创粉丝点击