动态集合:集合可以增大、缩小或随时间而变化。
动态集合上的操作可分为两类:
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
#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;
}
#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;
}
#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;
}