栈的基本操作------顺序结构
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.传参时,要注意。
关于栈的操作,看过一些创建栈的过程,有些设置栈顶指针,没有设置栈底指针,有些既设置了栈顶指针,又设置了栈底指针,下面给出一个设置栈底指针的例子。
#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.传参时,要注意。
相关文章推荐
- 顺序结构实现线性表的基本操作
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 【数据结构】顺序栈的基本操作操作---C/C++
- 【数据结构】顺序表的基本操作
- 数据结构顺序表相关基本操作练笔
- 【数据结构】顺序栈的基本操作操作---C/C++
- 数据结构之顺序栈的一些基本操作
- 数据结构——顺序表及其基本操作
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
- 数据结构(3)——顺序栈的基本操作
- 数据结构(1)——顺序表 交并差等基本操作
- 3.1.2顺序栈(存储结构由c3-1.h定义)的基本操作
- 【数据结构】顺序表的基本操作
- 【数据结构】顺序栈的基本操作操作---C/C++
- 数据结构之顺序表的基本操作
- 数据结构之线性表中顺序表的基本操作
- 进击的数据结构之六队列的基本操作-顺序结构
- 数据结构:顺序表的基本操作
- 数据结构——顺序表的基本操作
- 数据结构与算法———顺序表的基本操作