栈(stack)是限定在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
示例程序:(改编自《大话数据结构》)
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int top; //栈顶指针
} SqStack;
/* 构造一个空栈*/
bool InitStack(SqStack *Sq)
{
Sq->top = -1; //表示空栈
return true;
}
/* 置为空栈 */
bool ClearStack(SqStack *Sq)
{
cout << "Clear Stack ..." << endl;
Sq->top = -1;
return true;
}
bool StackEmpty(SqStack Sq)
{
if (Sq.top == -1)
return true;
else
return false;
}
int StackLength(SqStack Sq)
{
cout << "Stack Length : ";
return Sq.top + 1;
}
/* 返回栈顶元素 */
bool GetTop(SqStack Sq, ElemType *ptr)
{
if (Sq.top != -1)
{
*ptr = Sq.data[Sq.top];
cout << "Get Top Item " << *ptr << endl;
return true;
}
return false;
}
/* 压栈 */
bool Push(SqStack *Sq, ElemType Elem)
{
cout << "Push Item " << Elem << endl;
if (Sq->top + 1 > MAXSIZE - 1)
return false;
Sq->data[++Sq->top] = Elem;
return true;
}
/* 出栈 */
bool Pop(SqStack *Sq, ElemType *ptr)
{
if (Sq->top == -1)
return false;
*ptr = Sq->data[Sq->top--];
cout << "Pop Item " << *ptr << endl;
return true;
}
bool StackTraverse(SqStack Sq)
{
cout << "Traverse Stack ..." << endl;
if (Sq.top == -1)
return false;
for (int i = 0; i <= Sq.top; i++)
cout << Sq.data[i] << ' ';
cout << endl;
return true;
}
int main(void)
{
SqStack Sq;
InitStack(&Sq);
for (int i = 0; i < 5; i++)
Push(&Sq, i);
StackTraverse(Sq);
int result;
Pop(&Sq, &result);
StackTraverse(Sq);
GetTop(Sq, &result);
if (!StackEmpty(Sq))
cout << StackLength(Sq) << endl;
ClearStack(&Sq);
return 0;
}
输出为: