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

 

动态集合:集合可以增大、缩小或随时间而变化。
动态集合上的操作可分为两类:
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--;
*e = *((*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
...{
*e = *(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、付费专栏及课程。

余额充值