使用链表模拟链栈的实现

71 阅读2分钟

以下代码来自《大话数据结构》:

#include <bits/stdc++.h>
using namespace std;
//链栈结构
typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct
{
    LinkStackPtr top;
    int count;
}LinkStack;
int visit(int c)
{
    cout<<c<<" ";
    return 1;
}
//创造一个空栈
int InitStack(LinkStack *S)
{
    S->top=new StackNode;
    if(!S->top) return 0;
    S->top=NULL;
    S->count=0;
    return 1;
}
//将S置位空栈
int ClearStack(LinkStack *S)
{
    LinkStackPtr q,p;
    p=S->top;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    S->count=0;
    return 1;
}
//判断是否为空
int StackEmpty(LinkStack S)
{
    if(S.count==0) return 1;
    else return 0;
}
//返回栈的长度
int StackLength(LinkStack S)
{
    return S.count;
}
//返回栈顶元素
int GetTop(LinkStack S,int *e)
{
    if(S.top==NULL) return 0;
    else *e=S.top->data;
    return 1;
}
//插入元素e为新的栈顶元素
int Push(LinkStack *S,int e)
{
    LinkStackPtr s=new StackNode;
    s->data=e;
    s->next=S->top;
    S->top=s;
    S->count++;
    return 1;
}
//删除栈顶元素
int Pop(LinkStack *S,int *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S)) return 0;
    *e=S->top->data;
    p=S->top;
    S->top=S->top->next;
    free(p);
    S->count--;
    return 1;
}
//输出栈顶->栈底
int StackTraverse(LinkStack S)
{
    LinkStackPtr p=S.top;;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    cout<<endl;
    return 1;
}
int main()
{
    LinkStack s;
    int e;
    if(InitStack(&s)==1)
    {
        for(int j=1;j<=10;j++)
        {
            Push(&s,j);
        }
    }
    cout<<"栈中元素依次为:";
    StackTraverse(s);
    Pop(&s,&e);
    cout<<"弹出的栈顶元素为:"<<e<<endl;
    cout<<"栈是否为空:"<<StackEmpty(s)<<endl;
    GetTop(s,&e);
    cout<<"栈顶元素为:"<<e<<endl;
    cout<<"栈的长度为:"<<StackLength(s)<<endl;
    ClearStack(&s);
    cout<<"清空栈后,栈是否为空:"<<StackEmpty(s)<<endl;
    system("pause");
    return 0;
}

在编写的过程中,有些问题困扰了我很久:

1、22行S->top=new StackNode;为什么不是new LinkStackPtr?

这涉及到了new的用法,new需要分配一种具体的数据类型,LinkStackPtr是一个指向StackNode类型的指针类型,而不是一个具体的类型,因此不能使用LinkStackPtr。

2、什么时候传指针*,什么时候传引用&,我对此有些不明白,我将在之后的学习中对这一方面进行全面的学习与了解。如果有大佬看到这里,希望可以救救我这个蒟蒻,谢谢各位神犇!

如果有任何问题或建议,谢谢各位评论指出!