您的位置:首页 > 其它

栈的基本操作------顺序结构

2017-08-14 18:07 232 查看
好久没有复习数据结构了,突然间想复习一下数据结构,把课本上有关数据结构的操作与算法都敲一遍,虽然说是志向远大,不可能实现,但是还是尽力吧!

关于栈的操作,看过一些创建栈的过程,有些设置栈顶指针,没有设置栈底指针,有些既设置了栈顶指针,又设置了栈底指针,下面给出一个设置栈底指针的例子。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define INFEASIBLE  -1
#define OVERFLOW    -2 
typedef int Status;
typedef int SelemType;
typedef struct
{
     SelemType *base;
     SelemType *top;
     int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status StackEmpty(SqStack S);
Status GetTop(SqStack S,SelemType &e );
Status Push(SqStack &S,SelemType e);
Status Pop(SqStack &S,SelemType &e);
Status InitStack(SqStack &S)
{
     S.base=(SelemType*)malloc(STACK_INIT_SIZE*sizeof(SelemType));
     if(!S.base) exit(OVERFLOW);
     S.top=S.base;
     S.stacksize=STACK_INIT_SIZE;
     return OK;
}
Status StackEmpty(SqStack S)
{
     if(S.top==S.base) return OK;
     else
     return ERROR;
}
Status GetTop(SqStack S,SelemType &e)
{
     if(StackEmpty(S)) return ERROR;
     e=*(S.top-1);
     return OK;
}
Status Push(SqStack &S,SelemType e)
{
     if(S.top-S.base>=S.stacksize)
     {
          S.base=(SelemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SelemType));
          if(!S.base) exit(OVERFLOW);
          S.top=S.base+S.stacksize;
          S.stacksize+=STACKINCREMENT;
     }
     *S.top++=e;
     return OK;
}
Status Pop(SqStack &S,SelemType &e)
{
     if(S.top==S.base) return ERROR;
     e=*--S.top;
     return OK;
}
int main(void)
{
     SqStack S;
     SelemType e;
     InitStack(S);
     int a[6]={1,2,3,4,5,6};
     for(int i=0;i<6;i++)
     {
          Push(S,a[i]);
     } 
     while(!StackEmpty(S))
     {
          Pop(S,e);
          printf("%3d",e);
     }
}
 几点说明:

1.realloc函数


语法

指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

新的大小可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失[1-2]  )


头文件

#include <stdlib.h> 有些编译器需要#include <malloc.h>,在TC2.0中可以使用alloc.h头文件


功能

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。


返回值

如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
2.传参时,要注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: