栈是一种线性表,只不过它是操作受限的线性表,只能在一端操作。先进后出。
进出的一端称为栈顶(top),另一端称为栈底(base),栈可以用顺序存储,也可以用链式存储。
注意:
栈不允许在中间查找,取值,插入,删除等操作(不然会成为杂交栈)。可以初始化,入栈,出栈,取栈顶元素等。
顺序存储方式1:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 128
typedef int ElemType;
typedef struct _SqStack
{
ElemType* top;
ElemType* base;
}SqStack;
//初始化栈
bool initStack(SqStack& S)
{
S.base = new ElemType[MAX_SIZE];
if (!S.base) return false;
S.top = S.base;
return true;
}
//判断是否为空
bool isEmpty(SqStack& S)
{
if (S.top == S.base) return true;
return false;
}
//判断是否为满
bool isFull(SqStack& S)
{
if (S.top - S.base == MAX_SIZE) return true;
return false;
}
//压栈
bool pushStack(SqStack& S, ElemType elem)
{
if (isFull(S)) return false;
*(S.top++) = elem;
return true;
}
//出栈
bool popStack(SqStack& S, ElemType& elem)
{
if (isEmpty(S)) return false;
elem = *(--S.top);
return true;
}
//获取元素个数
int getSize(SqStack& S)
{
return (S.top - S.base);
}
//取栈顶
bool getTop(SqStack& S, ElemType& e)
{
if (isEmpty(S)) return false;
e = *(S.top - 1);
return true;
}
//销魂栈
void destoryStack(SqStack& S)
{
if (S.base)
{
delete S.base;
S.base = NULL;
S.top = NULL;
}
}
int main()
{
SqStack S;
ElemType elem = -1;
if (initStack(S))printf("初始化成功,开始压栈...\n");
for (int i = 0; i < 5; i++)
{
if (pushStack(S, i + 6))printf("%d,成功压栈\n", i + 6);
}
printf("此时元素个数是:%d\n", getSize(S));
getTop(S, elem);
printf("栈顶元素是:%d\n", elem);
printf("\n开始出栈...\n");
for (int i = 0; i < 6; i++)
{
if (popStack(S, elem))printf(" %d", elem);
else printf("\n出栈失败");
}
printf("\n此时元素个数是:%d\n", getSize(S));
destoryStack(S);
system("pause");
return 0;
}