数据结构——基本数据结构之栈

动态集合:集合可以增大、缩小或随时间而变化。
动态集合上的操作可分为两类:
1.查询,返回有关集合的信息;
2.修改:对集合有所改变。
Search(S, k):给定一个集合S和关键字k,返回一个指向S中元素的指针x,使key[x] = k,或当S中不存在这样的元素时返回NULL。
Insert(S, x):将由x指向的元素增加到S中去,通常假定x中的域都已被初始化。
Delete(S, x):当给定一个指向S中元素的指针x时,将x从S中去掉。
Minimum(S):是个全序集S上的查询,返回S中具有最小关键字的元素。
Maximum(S):是个全序集S上的查询,返回S中具有最大关键字的元素。
Successor(S, x):给定关键字属于全序集S上的某个元素x,返回S中比x大的下一个元素;当x为最大元素时,返回NULL。
Predecessor(S, x):给定关键字属于全序集S上的某个元素x,返回S中比x小的前一个元素;当x为最小元素时,返回NULL。

基本数据结构——栈

stack.h
#ifndef _STACK_H
#define  _STACK_H

typedef 
int  ElemType;
#define  StackInitSize 100
#define  StackIncrement 10

typedef 
struct  SqStack {
    ElemType 
*base;
    ElemType 
*top;
    
int stacksize;
}
Stack;

int  InitStack(Stack  ** s);
int  DestroyStack(Stack  ** s);
int  ClearStack(Stack  ** s);
int  StackEmpty(Stack  * s);
int  StackLength(Stack  * s);
int  GetTop(Stack  * s, ElemType  * e);
int  Push(Stack  ** s, ElemType e);
int  Pop(Stack  ** s, ElemType  * e);

#endif

stack.c
#include  < stdio.h >
#include 
< stdlib.h >
#include 
" stack.h "

/*构造一个空栈s*/
int  InitStack(Stack  ** s)
{
    (
*s)->base = (ElemType *)malloc(StackInitSize*sizeof(ElemType));
    
if(!(*s)->base)
        exit(
0);
    (
*s)->top = (*s)->base;
    (
*s)->stacksize = StackInitSize;

    
return 0;
}


/*销毁栈s,s不再存在*/
int  DestroyStack(Stack  ** s)
{
    ElemType 
*p;
    
while((*s)->top != (*s)->base)
    
{
        p 
= (*s)->top--;
        free(p);
    }

    p 
= NULL;

    
return 0;
}


/*插入元素e为新的栈顶元素*/
int  Push(Stack  ** s, ElemType e)
{
    
if((*s)->top - (*s)->base >= (*s)->stacksize)
    
{
        (
*s)->base = (ElemType *)realloc((*s)->base, ((*s)->stacksize + StackIncrement)*sizeof(ElemType));
        
if(!(*s)->base)
            exit(
0);
        (
*s)->top = (*s)->base + (*s)->stacksize;
        (
*s)->stacksize += StackIncrement;
    }

    
*((*s)->top++= e;

    
return 0;
}


/*删除s的栈顶元素,用e返回*/
int  Pop(Stack  ** s, ElemType  * e)
{
    
if((*s)->top == (*s)->base)
        exit(
1);
    (
*s)->top--;
    
*= *((*s)->top);

    
return 0;
}


/*判断栈是否为空*/
int  StackEmpty(Stack  * s)
{
    
if(s->top == s->base)
        
return 1;
    
else
        
return 0;
}


/*取栈顶元素,用e返回*/
int  GetTop(Stack  * s, ElemType  * e)
{
    
if(s->top == s->base)
        
return 0;
    
else
    
{
        
*= *(s->top - 1);
        
return 1;
    }

}


/*返回栈s元素个数*/
int  StackLength(Stack  * s)
{
    
return (s->top - s->base);
}


/*把s置为空栈*/
int  ClearStack(Stack  ** s)
{
    (
*s)->top = (*s)->base;

    
return 0;
}

StackMain.c
#include  < stdio.h >
#include 
< stdlib.h >
#include 
" stack.h "

/*简单实例*/
int  main( int  argc,  char   ** argv)
{
    ElemType elem;
    Stack 
*s;

    s 
= (Stack *)malloc(sizeof(Stack));
    InitStack(
&s);
    
while((elem = getchar()) != '#')
    
{
        Push(
&s, elem);
    }

    GetTop(s, 
&elem);
    printf(
"The top element is %c ", elem);
    printf(
"The length of the stack is %d ", StackLength(s));
//    ClearStack(&s);
    Push(&s, 'J');
    
while(!StackEmpty(s))
    
{
        Pop(
&s, &elem);
        printf(
"%c ", elem);
    }


    DestroyStack(
&s);

    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值