在这里首先补充一点,前面讲到的数据的四种逻辑结构,可以用物理存储的结构的任何一种都可以实现,要根据具体情况来选择。代码实现的大都是顺序存储和物理存储。
栈的思想:先进后出。关于栈的其他东西不讲了,下面展示栈的顺序存储代码的实现:
//栈的顺序实现
# include <iostream.h>
# include <stdlib.h>
//栈表头
struct sqstack
{
int * top;//用于存放栈顶地址
int * base;//用于存放栈基地址
void chushihua(struct sqstack &p)
{
p.base=(int*)malloc(10 * sizeof(int));//给栈顶赋初址
p.top=p.base;//给栈基赋初址
p.stacksize=10;//栈中内存数据的最大个数
}
//进栈函数
int push(sqstack &p,int e)
{
if(p.top-p.base>=p.stacksize)//判断栈是否满了
{//栈满后的操作
p.base=(int *)realloc(p.base,(p.stacksize+5));
p.top=p.base+p.stacksize;
p.stacksize=p.stacksize+5;
}
if(p.base==NULL)
{
cout<<"内存不够!\n";
return 0;//进栈失败的标志
}
*p.top++=e;//元素进栈
return 1;//进栈成功的标志
}
//出栈函数
int pop(sqstack &p,int &e)
{
if(p.top==p.base)//判断栈是否为空
{
cout<<"\n此栈为空栈!\n";
return 0;//出栈失败的标志
}
e = *(--p.top);//元素出栈
return 1;//出栈成功的标志
}
//显示该栈内容
void disstack(sqstack p)//此时,p不是引用,所以,栈头的base和top的值不变
{
cout<<"显示站内内容!\n";
while(p.top!=p.base)//显示栈中的元素,直到栈中元素全部显示出来
cout<<"\n"<<*(--p.top)<<"\n";
cout<<"显示操作完成!\n";
}
//销毁该栈
void destorystack(sqstack &p)
{
if(p.base)
{
free(p.base);//释放栈存储数据的内存
cout<<"释放空间操作完成!\n";
}
}
//主函数
void main()
{
sqstack head;//定义一个栈头
int e;//出栈和进栈时,用e来存放元素的值
int option;//option用来存放用户的选项
option=0;
e=0;
chushihua(head);
while(option!=5)
{
cout<<"\n\n\n\n";//显示菜单
cout<<" 菜单\n";
cout<<" 1、进栈\n";
cout<<" 2、出栈\n";
cout<<" 3、显示该栈内容\n";
cout<<" 4、销毁该栈\n";
cout<<" 5、退出";
cout<<"\n\n请选择操作:";
cin>>option;
//通过采用switch case语句便于用户的操作
switch(option)
{
case 1:
cout<<"请输入进栈的数值:";
cin>>e;
if(push(head,e))
cout<<"进栈成功!\n";
break;
case 2:
if(pop(head,e))
{
cout<<"出栈成功!\n";
cout<<"显示出栈元素:"<<e;
}
break;
case 3:
disstack(head);
break;
case 4:
destorystack(head);
break;
case 5:
cout<<"退出程序!\n";
break;
default:
break;
}
}
}
//把上面的主函数注释掉,然后加上下面的代码就可实现十进制向二进制和八进制之间的转换
//利用栈完成,进制之间的转化和输入的函数
void zhuanhuan(struct sqstack p, int n,int i)//n为十进制数,i为要转换为的进制
{
//进制之间的转换并进栈
while(n)
{//此循环中的代码很经典,仔细看
push(p,n%i);
n=n/i;
}
//把转换后的进制数进行出栈操作
cout<<"转换后的进制数位:";
while(p.top!=p.base)//当栈不为空时,就继续进行出栈
{
pop(p,n);//出栈
cout<<n;//显示出栈的元素值
}
cout<<"\n\n";
}
//十进制向二、八进制的转换
void main()
{
int n;//存放十进制数
int option;//存放用户的选择
sqstack p;//定义栈头
chushihua(p);//为该栈开辟相应的空间
option=0;//初始化选项为0
while(option!=3)
{
cout<<"\n\n\n\n 菜单\n";
cout<<" 1、十进制转化为二进制\n";
cout<<" 2、十进制转化为八进制\n";
cout<<" 3、退出\n";
cout<<"\n请输入您的选项:";
cin>>option;
switch(option)
{
case 1:
cout<<"请输入要转化的十进制数:";
cin>>n;
zhuanhuan(p,n,2);
break;
case 2:
cout<<"请输入要转化的十进制数:";
cin>>n;
zhuanhuan(p,n,8);
break;
case 3:
break;
default:
break;
}
}
cout<<"\n\n";
}
栈的链式存储代码的实现
# include <stdlib.h>
# include <iostream.h>
//栈中结点的数据元素类型
struct sqstack
{
int data;//存放相应的数据
struct sqstack * next;//存放下一个结点的地址
};
//进栈函数
void push(struct sqstack * &top,int e)//注意形式参数的类型以及传参的方式
{
struct sqstack *q;//定义一个可以存放栈中结点地址的指针
q=(struct sqstack *)malloc(sizeof(struct sqstack));//为其开辟空间
if(!q)//如果没开辟,就结束该函数的执行
return;
q->data=e;//把进栈值存放到q所指数据类型中的data元素中
q->next=top;//此语句和下一条语句是把q插入到栈中
top=q;
cout<<"进栈成功!\n";
}
//出栈函数
void pop(struct sqstack * &top,struct sqstack *base ,int &e)
{
if(top!=base)//栈不为空的操作
{ //top存放出栈元素的地址,并且栈每出一个,top的值就改变一次
e=top->data;
top=top->next;
cout<<"出栈成功!\n";
}
else
return;//结束函数的运行
}
//显示栈中的元素
void disstack(struct sqstack *top,struct sqstack *base)
{
//判断是否为空栈
if(top!=base)
cout<<"栈内元素如下:\n";
else
{
cout<<"栈内没有元素指\n";
return;
}
//当栈不为空时,就出栈
while(top!=base)
{
cout<<top->data<<"\n";
top=top->next;
}
cout<<"\n\n显示完毕!\n";
}
//销毁栈的元素
void delet(struct sqstack * &top,struct sqstack *base)
{
if(top)//不为空栈的操作
{
free(top);
top=base;
cout<<"释放空间成功!\n";
}
}
//主函数
void main()
{
int e;//进栈和出栈的元素
int option;//选择按钮
struct sqstack *top,*base;//栈顶和栈基地址
base=(struct sqstack *)malloc(sizeof(struct sqstack));
top=base;
option=0;//初始选项按钮为0
while(option!=5)
{
cout<<"\n\n\n\n 菜单\n";
cout<<" 1、进栈\n";
cout<<" 2、出栈\n";
cout<<" 3、显示栈中的内容\n";
cout<<" 4、销毁栈\n";
cout<<" 5、退出\n";
cout<<"\n请选择您的操作:";
cin>>option;
switch(option)
{
case 1:
cout<<"\n请输入进栈的元素值:";
cin>>e;
push(top,e);
break;
case 2:
pop(top,base,e);
cout<<"\n显示出栈元素值:"<<e<<"\n";
break;
case 3:
disstack(top,base);
break;
case 4:
delet(top,base);
break;
case 5:
break;
default:
break;
}
}
}
心得:确定栈中元素的数据类型;确定表头的形式(以此来判断是否需要给表头自定义一种新的数据类型);传参时,类型要相对应,并且要确定传参的形式;进栈和出栈时,top指针的变动,注意栈空和栈满(顺序存储)。本来想实现迷宫的代码的,怎么实现的思路自己有了,可是,写了一堆,运行不了,改天再好好弄那个。
栈的思想:先进后出。关于栈的其他东西不讲了,下面展示栈的顺序存储代码的实现:
//栈的顺序实现
# include <iostream.h>
# include <stdlib.h>
//栈表头
struct sqstack
{
int * top;//用于存放栈顶地址
int * base;//用于存放栈基地址
int stacksize;//用于存放栈的大小
};
//栈的初始化,就是给栈开辟空间void chushihua(struct sqstack &p)
{
p.base=(int*)malloc(10 * sizeof(int));//给栈顶赋初址
p.top=p.base;//给栈基赋初址
p.stacksize=10;//栈中内存数据的最大个数
}
//进栈函数
int push(sqstack &p,int e)
{
if(p.top-p.base>=p.stacksize)//判断栈是否满了
{//栈满后的操作
p.base=(int *)realloc(p.base,(p.stacksize+5));
p.top=p.base+p.stacksize;
p.stacksize=p.stacksize+5;
}
if(p.base==NULL)
{
cout<<"内存不够!\n";
return 0;//进栈失败的标志
}
*p.top++=e;//元素进栈
return 1;//进栈成功的标志
}
//出栈函数
int pop(sqstack &p,int &e)
{
if(p.top==p.base)//判断栈是否为空
{
cout<<"\n此栈为空栈!\n";
return 0;//出栈失败的标志
}
e = *(--p.top);//元素出栈
return 1;//出栈成功的标志
}
//显示该栈内容
void disstack(sqstack p)//此时,p不是引用,所以,栈头的base和top的值不变
{
cout<<"显示站内内容!\n";
while(p.top!=p.base)//显示栈中的元素,直到栈中元素全部显示出来
cout<<"\n"<<*(--p.top)<<"\n";
cout<<"显示操作完成!\n";
}
//销毁该栈
void destorystack(sqstack &p)
{
if(p.base)
{
free(p.base);//释放栈存储数据的内存
cout<<"释放空间操作完成!\n";
}
}
//主函数
void main()
{
sqstack head;//定义一个栈头
int e;//出栈和进栈时,用e来存放元素的值
int option;//option用来存放用户的选项
option=0;
e=0;
chushihua(head);
while(option!=5)
{
cout<<"\n\n\n\n";//显示菜单
cout<<" 菜单\n";
cout<<" 1、进栈\n";
cout<<" 2、出栈\n";
cout<<" 3、显示该栈内容\n";
cout<<" 4、销毁该栈\n";
cout<<" 5、退出";
cout<<"\n\n请选择操作:";
cin>>option;
//通过采用switch case语句便于用户的操作
switch(option)
{
case 1:
cout<<"请输入进栈的数值:";
cin>>e;
if(push(head,e))
cout<<"进栈成功!\n";
break;
case 2:
if(pop(head,e))
{
cout<<"出栈成功!\n";
cout<<"显示出栈元素:"<<e;
}
break;
case 3:
disstack(head);
break;
case 4:
destorystack(head);
break;
case 5:
cout<<"退出程序!\n";
break;
default:
break;
}
}
}
//把上面的主函数注释掉,然后加上下面的代码就可实现十进制向二进制和八进制之间的转换
//利用栈完成,进制之间的转化和输入的函数
void zhuanhuan(struct sqstack p, int n,int i)//n为十进制数,i为要转换为的进制
{
//进制之间的转换并进栈
while(n)
{//此循环中的代码很经典,仔细看
push(p,n%i);
n=n/i;
}
//把转换后的进制数进行出栈操作
cout<<"转换后的进制数位:";
while(p.top!=p.base)//当栈不为空时,就继续进行出栈
{
pop(p,n);//出栈
cout<<n;//显示出栈的元素值
}
cout<<"\n\n";
}
//十进制向二、八进制的转换
void main()
{
int n;//存放十进制数
int option;//存放用户的选择
sqstack p;//定义栈头
chushihua(p);//为该栈开辟相应的空间
option=0;//初始化选项为0
while(option!=3)
{
cout<<"\n\n\n\n 菜单\n";
cout<<" 1、十进制转化为二进制\n";
cout<<" 2、十进制转化为八进制\n";
cout<<" 3、退出\n";
cout<<"\n请输入您的选项:";
cin>>option;
switch(option)
{
case 1:
cout<<"请输入要转化的十进制数:";
cin>>n;
zhuanhuan(p,n,2);
break;
case 2:
cout<<"请输入要转化的十进制数:";
cin>>n;
zhuanhuan(p,n,8);
break;
case 3:
break;
default:
break;
}
}
cout<<"\n\n";
}
栈的链式存储代码的实现
# include <stdlib.h>
# include <iostream.h>
//栈中结点的数据元素类型
struct sqstack
{
int data;//存放相应的数据
struct sqstack * next;//存放下一个结点的地址
};
//进栈函数
void push(struct sqstack * &top,int e)//注意形式参数的类型以及传参的方式
{
struct sqstack *q;//定义一个可以存放栈中结点地址的指针
q=(struct sqstack *)malloc(sizeof(struct sqstack));//为其开辟空间
if(!q)//如果没开辟,就结束该函数的执行
return;
q->data=e;//把进栈值存放到q所指数据类型中的data元素中
q->next=top;//此语句和下一条语句是把q插入到栈中
top=q;
cout<<"进栈成功!\n";
}
//出栈函数
void pop(struct sqstack * &top,struct sqstack *base ,int &e)
{
if(top!=base)//栈不为空的操作
{ //top存放出栈元素的地址,并且栈每出一个,top的值就改变一次
e=top->data;
top=top->next;
cout<<"出栈成功!\n";
}
else
return;//结束函数的运行
}
//显示栈中的元素
void disstack(struct sqstack *top,struct sqstack *base)
{
//判断是否为空栈
if(top!=base)
cout<<"栈内元素如下:\n";
else
{
cout<<"栈内没有元素指\n";
return;
}
//当栈不为空时,就出栈
while(top!=base)
{
cout<<top->data<<"\n";
top=top->next;
}
cout<<"\n\n显示完毕!\n";
}
//销毁栈的元素
void delet(struct sqstack * &top,struct sqstack *base)
{
if(top)//不为空栈的操作
{
free(top);
top=base;
cout<<"释放空间成功!\n";
}
}
//主函数
void main()
{
int e;//进栈和出栈的元素
int option;//选择按钮
struct sqstack *top,*base;//栈顶和栈基地址
base=(struct sqstack *)malloc(sizeof(struct sqstack));
top=base;
option=0;//初始选项按钮为0
while(option!=5)
{
cout<<"\n\n\n\n 菜单\n";
cout<<" 1、进栈\n";
cout<<" 2、出栈\n";
cout<<" 3、显示栈中的内容\n";
cout<<" 4、销毁栈\n";
cout<<" 5、退出\n";
cout<<"\n请选择您的操作:";
cin>>option;
switch(option)
{
case 1:
cout<<"\n请输入进栈的元素值:";
cin>>e;
push(top,e);
break;
case 2:
pop(top,base,e);
cout<<"\n显示出栈元素值:"<<e<<"\n";
break;
case 3:
disstack(top,base);
break;
case 4:
delet(top,base);
break;
case 5:
break;
default:
break;
}
}
}
心得:确定栈中元素的数据类型;确定表头的形式(以此来判断是否需要给表头自定义一种新的数据类型);传参时,类型要相对应,并且要确定传参的形式;进栈和出栈时,top指针的变动,注意栈空和栈满(顺序存储)。本来想实现迷宫的代码的,怎么实现的思路自己有了,可是,写了一堆,运行不了,改天再好好弄那个。