以下代码来自《大话数据结构》:
#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、什么时候传指针*,什么时候传引用&,我对此有些不明白,我将在之后的学习中对这一方面进行全面的学习与了解。如果有大佬看到这里,希望可以救救我这个蒟蒻,谢谢各位神犇!
如果有任何问题或建议,谢谢各位评论指出!