栈的实现-链接表示

#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("\   退出操作");
 }
发布了23 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_35001005/article/details/51492860