C_栈和队列(ADT)-栈的表示和实现

来源:互联网 发布:淘宝买电脑可靠吗 编辑:程序博客网 时间:2024/05/22 03:27



堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。(图片和解释引用百度百科)



栈底指针是不动的,插入,删除都是对栈顶指针进行移动

基本操作的实现:栈的构造,判空,插入,删除,清空,销毁,打印

栈的定义:

typedef struct{ElemType*base;//栈底指针 ElemType*top;//栈顶指针 int stacksize;}SqStack;

栈的基本操作:

/*操作构造一个空栈S。*/InitStack(&S);/*初始条件:栈S已存在。*//*操作结果:栈S被销毁。*/DestroyStack(&S); /*初始条件:栈S已存在。*//*操作结果:将S清为空栈。*/ClearStack(&S);/*初始条件:栈S已存在。*//*操作结果:若栈S为空栈,则返回TRUE,否则FALSE*/StackEmpty(S);/*初始条件:栈S已存在。*//*操作结果:返回S的元素个数,即栈的长度。*/StackLength(S);/*初始条件:栈S已存在且非空。*//*操作结果:用e返回S的栈顶元素。*/GetTop(S,&e);/*初始条件:栈S已存在。*//*操作结果:插入元素e为新的栈顶元素。*/ Push(&S,e);/*初始条件:栈S已存在且非空。*//*操作结果:删除S的栈顶元素,并用e返回其值。*/Pop(&S,&e);/*初始条件:栈S已存在且非空。*//*操作结果:输出对栈中的元素进行*/void PrintStack(s); 

构造一个空栈====

Status InitStack(SqStack &s){//构建一个空栈S。 s.base=(ElemType*)malloc(STACK_INIT_SIZE*(sizeof(ElemType)));if(!s.base){printf("建栈失败!\n");return ERROR; }else{s.top=s.base;//栈底和栈顶指针指向同一块内存 s.stacksize=STACK_INIT_SIZE;return OK; }}

销毁栈====

Status DestroyStack(SqStack &s){//销毁栈s,s不再存在。 s.top=s.base;free(s.base);s.base=NULL;//释放后一定要指向NULL,避免出现野指针 s.top=NULL;return OK;}


清空栈====

ClearStack(&S);Status ClearStack(SqStack &s){//将S清为空栈。 s.top=s.base;//栈顶和栈底指针指向同一块内存此时栈中就没有其它元素 s.stacksize=0;return OK;}


判空栈====

Status StackEmpty(SqStack s){//若栈S为空栈,则返回TRUE,否则FALS。 if(s.top==s.base)return TRUE;elsereturn FALSE;}


判断栈中的长度====

Status StackLength(SqStack s){//返回S的元素个数,即栈的长度.。 return s.top-s.base;}

得到栈顶元素(用e返回)====

Status GetTop(SqStack s,ElemType &e){//用e返回S的栈顶元素 。 if(StackEmpty(s)){printf("这是一个空栈!");return ERROR;}else{s.top--;e=*s.top;return OK;}}

栈顶插入数据元素e====

Status Push(SqStack &s,ElemType e){//插入元素e为新的栈顶元素。if(StackLength(s)==STACK_INIT_SIZE){ElemType *temp=(ElemType*)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*(sizeof(ElemType)));  if(!temp)return ERROR;s.base=temp;s.top=s.base+STACK_INIT_SIZE;s.stacksize=STACK_INIT_SIZE+STACKINCREMENT;*(s.top++)=e;return OK;}else{*s.top=e;s.top++;return OK; }}

删除栈顶元素====

Status Pop(SqStack &s,ElemType &e){//删除S的栈顶元素,并用e返回其值if(StackEmpty(s)){printf("这是一个空栈\n");return ERROR; }else{e=*(--s.top);return OK;}}

显示栈中的数据元素====

void PrintStack(SqStack s){//显示栈中的元素 if(StackEmpty(s)){printf("栈中没有数据元素!\n");}while(s.top!=s.base){printf("%d ",*(--s.top));}printf("\n");}


嗯下面就是在VC上的测试:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define STACK_INIT_SIZE  100//存储空间初始化分配量#define STACKINCREMENT 10//存储空间分配增量 typedef int ElemType;typedef int Status;typedef struct{ElemType*base;//栈底指针 ElemType*top;//栈顶指针 int stacksize;}SqStack;Status InitStack(SqStack &s){//构建一个空栈S。 s.base=(ElemType*)malloc(STACK_INIT_SIZE*(sizeof(ElemType)));if(!s.base){printf("建栈失败!\n");return ERROR; }else{s.top=s.base;//栈底和栈顶指针指向同一块内存 s.stacksize=STACK_INIT_SIZE;return OK; }}Status DestroyStack(SqStack &s){//销毁栈s,s不再存在。 s.top=s.base;free(s.base);s.base=NULL;//释放后一定要指向NULL,避免出现野指针 s.top=NULL;return OK;}Status ClearStack(SqStack &s){//将S清为空栈。 s.top=s.base;//栈顶和栈底指针指向同一块内存此时栈中就没有其它元素 s.stacksize=0;return OK;}Status StackEmpty(SqStack s){//若栈S为空栈,则返回TRUE,否则FALS。 if(s.top==s.base)return TRUE;elsereturn FALSE;}Status StackLength(SqStack s){//返回S的元素个数,即栈的长度.。 return s.top-s.base;}Status GetTop(SqStack s,ElemType &e){//用e返回S的栈顶元素 。 if(StackEmpty(s)){printf("这是一个空栈!");return ERROR;}else{s.top--;e=*s.top;return OK;}}Status Push(SqStack &s,ElemType e){//插入元素e为新的栈顶元素。if(StackLength(s)==STACK_INIT_SIZE){ElemType *temp=(ElemType*)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*(sizeof(ElemType)));  if(!temp)return ERROR;s.base=temp;s.top=s.base+STACK_INIT_SIZE;s.stacksize=STACK_INIT_SIZE+STACKINCREMENT;*(s.top++)=e;return OK;}else{*s.top=e;s.top++;return OK; }}Status Pop(SqStack &s,ElemType &e){//删除S的栈顶元素,并用e返回其值if(StackEmpty(s)){printf("这是一个空栈\n");return ERROR; }else{e=*(--s.top);return OK;}}void PrintStack(SqStack s){//显示栈中的元素 if(StackEmpty(s)){printf("栈中没有数据元素!\n");}while(s.top!=s.base){printf("%d ",*(--s.top));}printf("\n");}int main(){int n;int ch;int num;SqStack stack;InitStack(stack);if(InitStack)printf("栈构建成功!\n"); elseprintf("栈构建失败!\n");printf("************************************\n");printf("1、插入栈顶元素\n2、删除栈顶元素\n3、返回栈顶元素\n");printf("4、返回栈的长度\n5、判断是否空栈\n6、清空栈内元素\n");printf("7、输出栈内元素\n8、销毁栈\n9、退出操作");printf("************************************\n");printf("请选择接下来要进行的操作:");while(scanf("%d",&ch)&&ch!=9) {if(ch==1){printf("请输入入栈个数:");scanf("%d",&num);printf("请依次输入入栈元素数据:\n");for(int i=0;i<num;i++){scanf("%d",&n);if(Push(stack,n))printf("%d已成功进栈!\n",n);elseprintf("%d进栈失败!\n",n);}}if(ch==2){if(Pop(stack,n))printf("删除栈中栈顶元素值为:%d\n",n);elseprintf("删除栈顶元素值失败!\n");}if(ch==3){GetTop(stack,n);if(GetTop(stack,n))printf("栈中栈顶元素值为:%d\n",n);elseprintf("操作失败!\n");}if(ch==4){printf("栈中栈的长度为:%d\n",StackLength(stack));}if(ch==5){if(StackEmpty(stack))printf("这是一个空栈!\n");elseprintf("这不是一个空栈!\n");}if(ch==6){ClearStack(stack);if(ClearStack(stack))printf("成功清空栈中元素!\n");elseprintf("操作失败!\n"); }if(ch==7){PrintStack(stack);}if(ch==8){DestroyStack(stack);if(DestroyStack(stack))printf("成功销毁栈!\n");elseprintf("销毁栈失败!\n"); }printf("请选择接下来要进行的操作:");}return 0;}