0
点赞
收藏
分享

微信扫一扫

数据结构-栈的实现和应用(day7)

潇湘落木life 2022-04-13 阅读 63
数据结构

一、顺序栈的原理

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)

允许进行操作的一端称为“栈顶”

另一固定端称为“栈底”

当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。

1.栈的应用:

如何排课:

 

 没有前驱的顶点可以通过一个栈去存储,借助于进栈出栈的操作,完成对图的特殊处理,检查它有没有回路。

先入后出

 二、顺序栈的实现

它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。
  
typedef  int  data_t ; /*定义栈中数据元素的数据类型*/
typedef struct 
{    
       data_t  *data ;     /*用指针指向栈的存储空间*/
       int  maxlen;    /*当前栈的最大元素个数*/
       int  top ;     /*指示栈顶位置(数组下标)的变量*/
  } sqstack;         /*顺序栈类型定义*/


1:创建栈

sqstack *stack_create (int len)
{
sqstack *ss;
ss = (seqstack *)malloc(sizeof(sqstack));
ss->data = (data_t *)malloc(sizeof(data_t) * len);
ss->top = -1;
ss->maxlen = len;    
return ss;
}

2.清空栈:

stack _clear(sqstack  *s)
{
     s-> top = -1 ;

3.判断栈是否空:

int  stack_empty (sqstack  *s)

    return   (s->top ==  -1  ?  1 : 0);
}

4.进栈:

void  stack_push (sqstack  *s ,  data_t  x)
{    if (s->top = = N - 1){
         printf ( “overflow !\n”) ; 
           return  ;
    }
    else  { 
        s->top ++  ;
        s->data[s->top] = x ;
     }
     return  ;
}

5.出栈:

datatype  stack_pop(sqstack *s)
{
 s->top--;
    return  (s->data[s->top+1]);
}    
6.取栈顶元素:

datatype  get_top(sqstack  *s)
{
      return (s->data[s->top]);
}
 

 分别申请三个指针的空间和栈的空间。

代码:

sqstack.h:

 sqstack.c:

 

 

 test.c:

运行结果:

 三、链式栈的实现

1.创建栈:

         插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。 
typedef  int  data_t ;     /*定义栈中数据元素数据类型*/
typedef  struct  node_t {
    data_t data ;           /*数据域*/
    struct  node_t  *next ;   /*链接指针域*/
}  linkstack_t ;           /*链栈类型定义*/

top就是头指针的意思

创建空栈 :
 linkstack_t  *CreateLinkstack() { 
     linkstack_t  *top;
     top  =  (linkstack_t  *)malloc(sizeof(linkstack_t));
     top->next = NULL;
     return  top;  
}

判断是否空栈 :
int  EmptyStack (linkstack_t *top)  
{    
    return  (top->next  == NULL  ?   1  :  0);
}

2.入栈 :
void   PushStack(linkstack_t *top,  data_t  x)
{    
linkstack_t  *p ;        
p = (linkstack_t *)malloc ( sizeof (linkstack_t) ) ; 
p->data = x ;     
p->next = top->next;
top->next  =  p;   
return;    
}
 

 3.出栈

 4.释放空间

 代码:

linkstack.h:

 linkstack.c:

 

 

 test.c:

运行结果:

if 0

 只进栈没有出栈,从栈顶一个个释放。

if 1

 进栈后一个个出栈,所以最后释放的是栈顶(头指针)

举报

相关推荐

0 条评论