实现数据结构C语言系列方法
#include<stdio.h>
#include<stdlib.h>
typedefintelemType;
/************************************************************************/
/*以下是关于栈顺序存储操作的6种算法 */
/************************************************************************/
structstack{
elemType*stack;/*存储栈元素的数组指针*/
inttop;/*存储栈顶元素的下标位置*/
intmaxSize;/*存储stack数组的长度*/
};
voidagainMalloc(structstack*s)
{
/*空间扩展为原来的2倍,原内容被自动拷贝到p所指向的存储空间中*/
elemType*p;
p=realloc(s->stack,2*s->maxSize*sizeof(elemType));
if(!p){
printf("内在分配失败! ");
exit(1);
}
s->stack=p;/*使stack指向新的栈空间*/
s->maxSize=2*s->maxSize;/*把栈空间的大小修改新的长度*/
return;
}
/*1.初始化栈s为空*/
voidinitStack(structstack*s,intms)
{
if(ms<=0){
printf("ms的值非法! ");
exit(1);
}
s->maxSize=ms;
s->stack=malloc(ms*(sizeof(elemType)));
if(!s->stack){
printf("内在分配失败! ");
exit(1);
}
s->top=-1;/*初始置栈为空*/
return;
}
/*2.新元素进栈,即把它插入到栈顶*/
voidpush(structstack*s,elemTypex)
{
/*若栈空间用尽则重新分配更大的存储空间*/
if(s->top==s->maxSize-1){
againMalloc(s);
}
s->top++;/*栈顶指针后移一个位置*/
s->stack[s->top]=x;/*将新元素插入到栈顶*/
return;
}
/*3.删除(弹出)栈顶元素并返回其值*/
elemTypepop(structstack*s)
{
/*若栈空则退出运行*/
if(s->top==-1){
printf("栈空,无元素出栈! ");
exit(1);
}
s->top--;/*栈顶指针减1表示出栈*/
returns->stack[s->top+1];/*返回原栈顶元素的值*/
}
/*4.读取栈顶元素的值*/
elemTypepeek(structstack*s)
{
/*若栈空则退出运行*/
if(s->top==-1){
printf("栈空,无元素可读取! ");
exit(1);
}
returns->stack[s->top];/*返回原栈顶元素的值*/
}
/*5.判断s是否为空,若是则返回1表示真,否则返回0表示假*/
intemptyStack(structstack*s)
{
if(s->top==-1){
return1;
}else{
return0;
}
}
/*6.清除栈s中的所有元素,释放动态存储空间*/
voidclearStack(structstack*s)
{
if(s->stack){
free(s->stack);
s->stack=NULL;
s->top=-1;
s->maxSize=0;
}
return;
}
/************************************************************************/
intmain()
{
structstacks;
inta[8]={3,8,5,17,9,30,15,22};
inti;
initStack(&s,5);
for(i=0;i<8;i++){
push(&s,a[i]);
}
printf("%d",pop(&s));printf("%d ",pop(&s));
push(&s,68);
printf("%d",peek(&s));printf("%d ",pop(&s));
while(!emptyStack(&s)){
printf("%d",pop(&s));
}
printf(" ");
clearStack(&s);
system("pause");
return0;
}
#include<stdlib.h>
typedefintelemType;
/************************************************************************/
/*以下是关于栈顺序存储操作的6种算法 */
/************************************************************************/
structstack{
elemType*stack;/*存储栈元素的数组指针*/
inttop;/*存储栈顶元素的下标位置*/
intmaxSize;/*存储stack数组的长度*/
};
voidagainMalloc(structstack*s)
{
/*空间扩展为原来的2倍,原内容被自动拷贝到p所指向的存储空间中*/
elemType*p;
p=realloc(s->stack,2*s->maxSize*sizeof(elemType));
if(!p){
printf("内在分配失败! ");
exit(1);
}
s->stack=p;/*使stack指向新的栈空间*/
s->maxSize=2*s->maxSize;/*把栈空间的大小修改新的长度*/
return;
}
/*1.初始化栈s为空*/
voidinitStack(structstack*s,intms)
{
if(ms<=0){
printf("ms的值非法! ");
exit(1);
}
s->maxSize=ms;
s->stack=malloc(ms*(sizeof(elemType)));
if(!s->stack){
printf("内在分配失败! ");
exit(1);
}
s->top=-1;/*初始置栈为空*/
return;
}
/*2.新元素进栈,即把它插入到栈顶*/
voidpush(structstack*s,elemTypex)
{
/*若栈空间用尽则重新分配更大的存储空间*/
if(s->top==s->maxSize-1){
againMalloc(s);
}
s->top++;/*栈顶指针后移一个位置*/
s->stack[s->top]=x;/*将新元素插入到栈顶*/
return;
}
/*3.删除(弹出)栈顶元素并返回其值*/
elemTypepop(structstack*s)
{
/*若栈空则退出运行*/
if(s->top==-1){
printf("栈空,无元素出栈! ");
exit(1);
}
s->top--;/*栈顶指针减1表示出栈*/
returns->stack[s->top+1];/*返回原栈顶元素的值*/
}
/*4.读取栈顶元素的值*/
elemTypepeek(structstack*s)
{
/*若栈空则退出运行*/
if(s->top==-1){
printf("栈空,无元素可读取! ");
exit(1);
}
returns->stack[s->top];/*返回原栈顶元素的值*/
}
/*5.判断s是否为空,若是则返回1表示真,否则返回0表示假*/
intemptyStack(structstack*s)
{
if(s->top==-1){
return1;
}else{
return0;
}
}
/*6.清除栈s中的所有元素,释放动态存储空间*/
voidclearStack(structstack*s)
{
if(s->stack){
free(s->stack);
s->stack=NULL;
s->top=-1;
s->maxSize=0;
}
return;
}
/************************************************************************/
intmain()
{
structstacks;
inta[8]={3,8,5,17,9,30,15,22};
inti;
initStack(&s,5);
for(i=0;i<8;i++){
push(&s,a[i]);
}
printf("%d",pop(&s));printf("%d ",pop(&s));
push(&s,68);
printf("%d",peek(&s));printf("%d ",pop(&s));
while(!emptyStack(&s)){
printf("%d",pop(&s));
}
printf(" ");
clearStack(&s);
system("pause");
return0;
}
/************************************************************************/
/*以下是关于栈链接存储操作的6种算法*/
/************************************************************************/
structsNode{
elemTypedata;
structsNode*next;
};
/*1.初始化链栈为空*/
voidinitStack(structsNode**hs)
{
*hs=NULL;
return;
}
/*2.向链中插入一个元素(入栈)*/
voidpush(structsNode**hs,elemTypex)
{
structsNode*newP;
newP=malloc(sizeof(structsNode));
if(newP==NULL){
printf("内在空间分配失败! ");
exit(1);
}
newP->data=x;/*给新分配的结点赋值*/
/*向栈顶插入新结点*/
newP->next=*hs;
*hs=newP;
return;
}
/*3.从链栈中删除一个元素并返回它(出栈)*/
elemTypepop(structsNode**hs)
{
structsNode*p;
elemTypetemp;
if(*hs==NULL){
printf("栈空无法删除! ");
exit(1);
}
/*暂存栈顶结点指针,并使栈顶指针指向下一个结点*/
p=*hs;
*hs=p->next;
/*暂存原栈顶元素以便返回,同时回收原栈顶结点*/
temp=p->data;
free(p);
returntemp;/*返回原栈顶元素*/
}
/*4.读取栈顶元素*/
elemTypepeek(structsNode**hs)
{
/*对于空栈则退出运行*/
if(*hs==NULL){
printf("栈空,无栈顶元素! ");
exit(1);
}
return(*hs)->data;/*返回栈顶结点的值*/
}
/*5.判断链栈是否为空,为空返回1,否则返回0*/
intemptyStack(structsNode**hs)
{
if(*hs==NULL){
return1;
}else{
return0;
}
}
/*6.清除链栈为空*/
voidclearStack(structsNode**hs)
{
structsNode*cp,*np;
cp=*hs;/*使cp指向栈顶结点*/
/*从栈底依次删除每个结点*/
while(cp!=NULL){
np=cp->next;
free(cp);
cp=np;
}
*hs=NULL;/*置链栈为空*/
return;
}
/************************************************************************/
/*以下是关于栈链接存储操作的6种算法*/
/************************************************************************/
structsNode{
elemTypedata;
structsNode*next;
};
/*1.初始化链栈为空*/
voidinitStack(structsNode**hs)
{
*hs=NULL;
return;
}
/*2.向链中插入一个元素(入栈)*/
voidpush(structsNode**hs,elemTypex)
{
structsNode*newP;
newP=malloc(sizeof(structsNode));
if(newP==NULL){
printf("内在空间分配失败! ");
exit(1);
}
newP->data=x;/*给新分配的结点赋值*/
/*向栈顶插入新结点*/
newP->next=*hs;
*hs=newP;
return;
}
/*3.从链栈中删除一个元素并返回它(出栈)*/
elemTypepop(structsNode**hs)
{
structsNode*p;
elemTypetemp;
if(*hs==NULL){
printf("栈空无法删除! ");
exit(1);
}
/*暂存栈顶结点指针,并使栈顶指针指向下一个结点*/
p=*hs;
*hs=p->next;
/*暂存原栈顶元素以便返回,同时回收原栈顶结点*/
temp=p->data;
free(p);
returntemp;/*返回原栈顶元素*/
}
/*4.读取栈顶元素*/
elemTypepeek(structsNode**hs)
{
/*对于空栈则退出运行*/
if(*hs==NULL){
printf("栈空,无栈顶元素! ");
exit(1);
}
return(*hs)->data;/*返回栈顶结点的值*/
}
/*5.判断链栈是否为空,为空返回1,否则返回0*/
intemptyStack(structsNode**hs)
{
if(*hs==NULL){
return1;
}else{
return0;
}
}
/*6.清除链栈为空*/
voidclearStack(structsNode**hs)
{
structsNode*cp,*np;
cp=*hs;/*使cp指向栈顶结点*/
/*从栈底依次删除每个结点*/
while(cp!=NULL){
np=cp->next;
free(cp);
cp=np;
}
*hs=NULL;/*置链栈为空*/
return;
}
/************************************************************************/
本文地址:http://www.45fan.com/dnjc/72427.html