对比顺序栈与链栈,他们的时间复杂度是一样的,均为O(1)。对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在内存空间浪费的问题,但它的优势是存取的定位方便,而链栈则要求每个元素都有指针域,这也增加了一些内存开销,但对于栈的长度无限制。如果栈的使用过程中元素变化不可预料,有时很小有时很大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些。
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkStack;
//链栈的第一个结点top不作为结点,top->next才作为链栈的第一个结点
Status InitList(LinkStack *S)
{
*S=(Node*)malloc(sizeof(Node));
(*S)->next=NULL;
return TRUE;
}
//返回线性表的元素个数
int ListLength(LinkStack S)
{
int count=0;
LinkStack s;
s=S->next;
while(s!=NULL)
{
count++;
s=s->next;
}
return count;
}
Status Push(LinkStack *S,ElemType e)
{
LinkStack s;
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=(*S)->next;
(*S)->next=s;
return TRUE;
}
Status Pop(LinkStack *S,ElemType *e)
{
LinkStack s;
*e=(*S)->next->data;
s=(*S)->next;
(*S)->next=s->next;
free(s);
return TRUE;
}
int main()
{
LinkStack s;
ElemType e=1;
InitList(&s);
Push(&s,e);
cout<<(ListLength(s))<<endl;
Pop(&s,&e);
cout<<e<<endl;
return 0;
}