栈的实现-链接表示

#include <stdio.h>
#include <stdlib.h>


 struct Node;
 typedef struct Node *PNode;    /* 指向结点的指针类型 */
 struct Node{
    int info;
    PNode link;
    };
                                /* 链栈类型定义*/
 struct LinkStack{              /*为了强调栈顶是栈的一个属性,对栈增加了一层封装*/
    PNode top;
 };


 typedef struct LinkStack *PLinkStack;




 PLinkStack createEmptyStack_link(void)    /*创建一个空链栈*/
 {
     PLinkStack plstack;
     plstack = (PLinkStack)malloc(sizeof(struct LinkStack));   /*  申请  struct LinkStack  结构的空间 */
     if(plstack!=NULL)
        plstack->top=NULL;
     else
        printf("Out of space!!\n");  /*创建失败  */
    return plstack;


 }




 int isEmptyStack_link(PLinkStack plstack)   /*判断单链式栈是否为空*/
 {
      return(plstack->top==NULL);
 }


                                                    /*进栈*/
 void push_link(PLinkStack plstack,int x)           /* 在栈中压入一个元素  */
 {
     PNode p;
     p=(PNode)malloc(sizeof(struct Node));          /* 申请结点空间*/
     if(p==NULL){
        printf("Out of space!!!\n");
     }
     else{
        p->info=x;
        p->link=plstack->top;
        plstack->top=p;
     }
 }




 void pop_link(PLinkStack plstack)      /*出栈*/
 {
     PNode p;
     if(isEmptyStack_link(plstack))
        printf("Empty stack pop.\n");
     else{
        p=plstack->top;
        plstack->top=p->link;       /*当栈不空时直接修改栈顶指针,删除结点  */
        free(p);
     }
 }




 int top_link(PLinkStack plstack)       /*取栈顶元素*/
 {
     if(plstack->top==NULL)
        printf("Stack is empty\n");          /*  当不空时取出栈顶元素的值,,栈保持不变*/
     else
        return(plstack->top->info);
 }


 int main()
 {
    int a,m=1;
    printf("栈链式的大小:\n");
    scanf("%d",&a);
    PLinkStack A;
    A=createEmptyStack_link();                  /* A=isEmptyStack_link(A)   若为空栈返回值为1,若不为空返回值


为0 \n"); */
    while(m==1){
         printf("请选择你需要的操作:\n");
         printf("1:打印:\n");
         printf("2:入栈:\n");
         printf("3:出栈:\n");
         printf("4:取栈顶元素:\n");
         int op;
         int k,q;
         PNode p;
         scanf("%d",&op);
         switch(op){
         case 1:
              printf("打印:\n");
              p=A->top;
              while(p!=NULL){
              printf("%d ",p->info);
              p=p->link;
              }
              break;
         case 2:
              printf("入栈");
              for(q=0;q<a;q++){
                printf("\n请继续输入:");
                scanf("%d",&k);
                push_link(A,k);
              }
              break;
         case 3:
              printf("出栈:\n");
              printf("%d\n",A->top->info);
              pop_link(A);
              break;
         case 4:
              printf("取栈顶元素:\n");
              top_link(A);
              printf("%d\n",A->top->info);
              break;
         }
         printf("\n需要继续操作请输入“1”,退出输入“0”\n");
         scanf("%d",&m);
         }
     printf("\   退出操作");
 }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值