栈的链式表示和实现

#include <bits/stdc++.h>
using namespace std;
typedef struct node
{
    int data;//数据
    struct node *next;//指针域
}node;
typedef struct Linkedstrack
{
    node *top;
    int size;
}Linkedstrack;
//栈的链式初始化
void initstrack(Linkedstrack *pstrack)
{
    pstrack->top=NULL;
    pstrack->size=0;
}

//清空栈
void emptystrack(Linkedstrack *pstrack)
{
    //判断栈是否为空
    if(pstrack->size==0)
    {
        printf("栈已为空!\n");
        exit(-1);//perror(".....");
    }
    while(pstrack->size)
    {
        node *p=pstrack->top;
        pstrack->top=pstrack->top->next;
        free(p);
        pstrack->size--;
    }
}
//销毁栈
void destorystrack(Linkedstrack *pstrack)
{
    free(pstrack);
    return;
}
//栈空的判断
bool  isempty(Linkedstrack strack)
{
    return strack.size==0;


}
//栈空的判断
void whetherempty(Linkedstrack strack)
{
    if(isempty(strack)) printf("该栈为空!\n");
    else printf("该栈不为空!\n");
}

//栈满的判断
node *isfull()
{
    node *newNode=(node*)malloc(sizeof(node));
    if(newNode==NULL)
    {
        printf("分配内存失败!栈满\n");
        exit(-1);
    }
    else printf("栈未满\n");
    return newNode;
}
//入栈
void push(Linkedstrack *pstrack)
{
    int data;
    printf("请输入入栈元素:\n");
    scanf("%d",&data);
    node *newNode;
    newNode=isfull();//判断栈满,栈未满时创建一个新结点
    newNode->data=data;
    newNode->next=pstrack->top;
    pstrack->top=newNode;
    pstrack->size++;
}
//出栈
void pop(Linkedstrack *pstrack)
{
    int temp;
    //判断栈是否为空
    if(pstrack->size==0)
    {
        printf("栈为空,无法弹出!\n");
        exit(-1);//perror(".....");
    }
    node *p;
    p=pstrack->top;
    temp=pstrack->top->data;
    pstrack->top=pstrack->top->next;
    free(p);
    pstrack->size--;
    printf("出栈元素为:%d\n",temp);
}
//得到栈顶元素
void searchtop(Linkedstrack strack)
{
    //判断栈是否为空
    if(isempty(strack))
    {
        printf("栈为空,无法找到栈顶元素!\n");
        exit(-1);//perror(".....");
    }
    printf("栈顶元素为:%d\n",strack.top->data);
}
//栈的遍历
void printstract(Linkedstrack strack)
{
    //判断栈是否为空
    if(isempty(strack))
    {
        printf("栈为空,无法遍历!\n");
        exit(-1);//perror(".....");
    }
    node *p;
    p=strack.top;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
 //菜单
    void menu()
    {
       printf("********1.清空栈      2.销毁栈*********\n");
       printf("********3.退出  4.入栈*********\n");
       printf("********5.出栈        6.得到栈顶元素********\n");
       printf("********7.栈的遍历    8,判断栈是否为空********\n");
    }
    //主函数
int main()
{
     Linkedstrack Linkedstrack ;
     initstrack(&Linkedstrack);//初始化
     int choice;
     while(1)
     {
      menu();
      printf("请输入菜单序号:\n");
      scanf("%d",&choice);
      if(choice==3) break;
      switch(choice)
      {
      case 1:emptystrack(&Linkedstrack);break;
      case 2:destorystrack(&Linkedstrack);break;
      case 4:push(&Linkedstrack);break;
      case 5:pop(&Linkedstrack);break;
      case 6:searchtop(Linkedstrack);break;
      case 7:printstract(Linkedstrack);break;
      case 8:whetherempty(Linkedstrack);break;
      default:printf("输入错误!!!\n");
      }
     }
     return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值