数据结构考研复习(链栈)

参考网上的内容,大部分的链栈实现用到了栈底和栈顶两个指针,而下文整理的这份代码,基本上与单链表的实现方式如出一辙。

与王道复习指导上给的栈的链式存储类型相一致。

#include<stdio.h>

#include<malloc.h>

typedef struct Linknode{
    int data;
    struct Linknode *next;
}Linknode,*LiStack;


/* -1- 初始化链栈*/
bool InitStack(LiStack S){
    S->next = NULL;
    return true;
}

/* -2- 判断是否栈空*/
bool StackEmpty(LiStack S){
    if(S->next == NULL){
        printf("空栈!\n");
        return true;
    }
    else{
        return false;
    }
}

/* -3- 进栈(插入元素)*/
bool Push(LiStack S,int e){
   Linknode *temp;
   temp = (Linknode*)malloc(sizeof(Linknode));


   temp->data = e;//!1
   temp->next = S->next;//!2
   S->next = temp;//!3
  //!!!S->next是首元节点

   return true;
}

/* -4- 读取栈顶元素*/
int GetTop(LiStack S,int e){
    if(!StackEmpty(S)){
        e = S->next->data;//!4
    }
    else{
        return false;
    }

   return e;
}

/* -5- 出栈*/
bool Pop(LiStack S,int e)
{
   Linknode *temp = S->next;
   e = temp->data;
   S->next = temp->next;
   free(temp);

   return true;
}



int main(){

    LiStack S;

    S = (LiStack)malloc(sizeof(Linknode));
    InitStack(S);

    int l;
    printf("请输入元素个数:\n");
    scanf("%d",&l);
    printf("请依次输入:\n");
    for(int i=0; i<l; i++){
        int m;
        scanf("%d",&m);
        Push(S,m);
    }

    int flag;
    printf("请进行选择:\n");
    printf("==1.栈顶元素:\n");
    printf("==2.依次输出栈内元素:\n");
    scanf("%d",&flag);
    switch(flag){
    case(1):
        {
             int e;
             printf("当前栈顶元素为:%d\n",GetTop(S,e));
             break;
        }
    case(2):
        {
             int i=0;
             while(l > 0)
            {
                int n;
                printf("经过第%d次出栈操作后,当前栈顶元素为:%d\n",i,GetTop(S,n));
                Pop(S,n);
                l--;
                i++;
           }
             printf("结束!\n");
             break;
        }
    }

    return 0;
}

最终结果:

数据结构考研复习(链栈)

 

 

上一篇:线性表之单链表


下一篇:java中Date与String的相互转换