栈是线性表的特例,所以和线性表一样有顺序存储和链式存储。其线性存储是线性表顺序存储的简化。
下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它做栈底。
#include<iostream>
using namespace std;
const int MAXSIZE = 100;
const int OK = 1;
const int ERROR =0;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *S,ElemType e)
{
if(S->top == MAXSIZE-1)//栈满
{
return ERROR;
}
S->top++;
S->data[S->top]=e;
return OK;
}
Status Pop(SqStack *S,ElemType *e)
{
if(S->top == -1)//栈空
return ERROR;
*e = S->data[S->top];
S->top--;
return OK;
}
void PrintStack(SqStack S)
{
cout<<"从栈底到栈顶:";
for(int i=0;i<S.top+1;i++)
cout<<S.data[i]<<" ";
cout<<endl;
}
int main()
{
SqStack stackA;
stackA.top = -1;
for(int i=0;i<10;i++)
{
cout<<i*i<<"入栈"<<endl;
Push(&stackA,i*i);
}
PrintStack(stackA);
ElemType e;
for(int j=0;j<5;j++)
{
Pop(&stackA,&e);
cout<<e<<"出栈"<<endl;
}
PrintStack(stackA);
getchar();
}
结果
Pop和Push的时间复杂度都是O(1).