栈的数组表示
2016-04-13 19:37
501 查看
数据结构刚学完这点,还是觉的用链表比较好。
//array for stack
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFSIZE 20
typedef char ELEMTYPE;//top&base's type can be changed for use
typedef struct
{
ELEMTYPE *base;
ELEMTYPE *top;
int stackSize;
}SQSTACK,*SQSTACKP;
SQSTACKP initstack(SQSTACKP sqstack);
int isfull(SQSTACKP sqstack);
int isempty(SQSTACKP sqstack);
int push(SQSTACKP sqstack,ELEMTYPE elem);
ELEMTYPE pop(SQSTACKP sqstack);
ELEMTYPE gettop(SQSTACKP sqstack);
int addroom(SQSTACKP sqstack,int howmuch);
void main()
{
SQSTACKP stack=NULL;
char i = 48;
stack=initstack(stack);
while(i<=67)
push(stack,i++);
while(isempty(stack)!=1)
{
printf("%d\n",pop(stack));
i--;
}
getchar();
free((*stack).base);
free(stack);
}
SQSTACKP initstack(SQSTACKP sqstack)//initialise
{
sqstack=(SQSTACKP)malloc(sizeof(SQSTACK));
if(!sqstack) return NULL;
(*sqstack).base=(ELEMTYPE*)malloc(DEFSIZE*sizeof(ELEMTYPE)+1);//one more nod as final,avoid wild pointer
if(!(*sqstack).base) return NULL;
(*sqstack).top=(*sqstack).base;
(*sqstack).stackSize=DEFSIZE;
return sqstack;
}//initstack
int isfull(SQSTACKP sqstack)//full return 1,not full return -1
{
if((*sqstack).top==((*sqstack).base+(*sqstack).stackSize)) return 1;//full condition
return -1;
}//isfull
int isempty(SQSTACKP sqstack)//empty return 1,not empty return -1
{
if((*sqstack).base==(*sqstack).top) return 1;
return -1;
}//isempty
int push(SQSTACKP sqstack,ELEMTYPE elem)//success return 1,fail return -1
{
if(isfull(sqstack)==1)
if(addroom(sqstack,5)==-1) return -1;
*(*sqstack).top++=elem;
return 1;
}//push
ELEMTYPE pop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return '#';//error return '#'
return *--(*sqstack).top;
}//pop
ELEMTYPE gettop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return '#';
return *((*sqstack).top-1);
}//gettop
int addroom(SQSTACKP sqstack,int howmuch)
{
void *temp;
if((*sqstack).stackSize>=1000) return -1;//too much memory is not allowed
temp=(ELEMTYPE*)realloc((*sqstack).base,sizeof(ELEMTYPE)*((*sqstack).stackSize+howmuch+1));
if(!temp) return -1;
(*sqstack).base=temp;
(*sqstack).stackSize=(*sqstack).stackSize+howmuch;
return 1;
}//addroom
以后会附上一些用栈的算法。
欢迎批评指正。
//array for stack
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFSIZE 20
typedef char ELEMTYPE;//top&base's type can be changed for use
typedef struct
{
ELEMTYPE *base;
ELEMTYPE *top;
int stackSize;
}SQSTACK,*SQSTACKP;
SQSTACKP initstack(SQSTACKP sqstack);
int isfull(SQSTACKP sqstack);
int isempty(SQSTACKP sqstack);
int push(SQSTACKP sqstack,ELEMTYPE elem);
ELEMTYPE pop(SQSTACKP sqstack);
ELEMTYPE gettop(SQSTACKP sqstack);
int addroom(SQSTACKP sqstack,int howmuch);
void main()
{
SQSTACKP stack=NULL;
char i = 48;
stack=initstack(stack);
while(i<=67)
push(stack,i++);
while(isempty(stack)!=1)
{
printf("%d\n",pop(stack));
i--;
}
getchar();
free((*stack).base);
free(stack);
}
SQSTACKP initstack(SQSTACKP sqstack)//initialise
{
sqstack=(SQSTACKP)malloc(sizeof(SQSTACK));
if(!sqstack) return NULL;
(*sqstack).base=(ELEMTYPE*)malloc(DEFSIZE*sizeof(ELEMTYPE)+1);//one more nod as final,avoid wild pointer
if(!(*sqstack).base) return NULL;
(*sqstack).top=(*sqstack).base;
(*sqstack).stackSize=DEFSIZE;
return sqstack;
}//initstack
int isfull(SQSTACKP sqstack)//full return 1,not full return -1
{
if((*sqstack).top==((*sqstack).base+(*sqstack).stackSize)) return 1;//full condition
return -1;
}//isfull
int isempty(SQSTACKP sqstack)//empty return 1,not empty return -1
{
if((*sqstack).base==(*sqstack).top) return 1;
return -1;
}//isempty
int push(SQSTACKP sqstack,ELEMTYPE elem)//success return 1,fail return -1
{
if(isfull(sqstack)==1)
if(addroom(sqstack,5)==-1) return -1;
*(*sqstack).top++=elem;
return 1;
}//push
ELEMTYPE pop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return '#';//error return '#'
return *--(*sqstack).top;
}//pop
ELEMTYPE gettop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return '#';
return *((*sqstack).top-1);
}//gettop
int addroom(SQSTACKP sqstack,int howmuch)
{
void *temp;
if((*sqstack).stackSize>=1000) return -1;//too much memory is not allowed
temp=(ELEMTYPE*)realloc((*sqstack).base,sizeof(ELEMTYPE)*((*sqstack).stackSize+howmuch+1));
if(!temp) return -1;
(*sqstack).base=temp;
(*sqstack).stackSize=(*sqstack).stackSize+howmuch;
return 1;
}//addroom
以后会附上一些用栈的算法。
欢迎批评指正。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++基于栈实现铁轨问题
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法