现在的位置: 首页 > 综合 > 正文

栈的顺序存储和链式存储以及应用

2013年10月02日 ⁄ 综合 ⁄ 共 4123字 ⁄ 字号 评论关闭

       在这里首先补充一点,前面讲到的数据的四种逻辑结构,可以用物理存储的结构的任何一种都可以实现,要根据具体情况来选择。代码实现的大都是顺序存储和物理存储。
       栈的思想:先进后出。关于栈的其他东西不讲了,下面展示栈的顺序存储代码的实现:
//栈的顺序实现
# 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指针的变动,注意栈空和栈满(顺序存储)。本来想实现迷宫的代码的,怎么实现的思路自己有了,可是,写了一堆,运行不了,改天再好好弄那个。

 

抱歉!评论已关闭.