栈(Stack): 一种只允许在一端进行插入和删除的线性表,并且此端为栈顶(top),另一端不允许插入和删除,为栈底。无任何元素时为空栈。
栈的操作可以归结为: 后进先出(LIFO)。即先存入的数据,必须要等到在其上面的数据都弹出之后才可以读取。
栈的结构定义:
//栈元素静态存储结构 C
#define maxSize 100 //最大元素数量
typedef int SElemType; //元素类型
typedef struct {
SElemType elem[maxSize]; //分配相应大小的数组
int top; //栈顶元素
} SeqStack;
//栈元素动态存储结构 C
#define initSize 100 //初始化元素数量
typedef int SElemType
typedef struct {
SElemType *elem; //栈元素存储数组
int maxSize,top; //栈最大元素数量,栈顶元素
} SeqStack;
栈初始化操作:
//栈的初始化
void InitStack(SeqStack &S)
{
S.elem = new SElemType[initSize]; //给栈分配存储空间
if(!S.elem) {cerr<<"存储失败\n";exit(1);} //分配成功确定
S.maxSize = initSize; //设置最大元素数量
S.top = -1; //栈顶初始化指向
};
.判断栈是否已满,若栈不满则将元素入栈至栈顶,若栈空间已满则进行溢出操作(扩充动态栈的存储空间)。
void Push(SeqStack &S, SElemType x)
{
if(!SeqStack) { cerr<<"参数错误";exit(1);}
else
if(StackFull(S))
{
SElemType *newArray = new SElemType[S.maxSize*2]; //建立二倍于原栈空间的新空间
if(!newArray) { cerr<<"存储分配失败";exit(1);}
//逐个元素复制
for(int i=0; i < S.top; i++)
newArray[i] = S.elem[i];
S.maxSize = 2*S.maxSize;
delete []S.elem;
S.elem = newArray;
}
else
S.[++S.top] = x;
}
(程序为自己参照编写,如有错误,请指正)
退栈操作:
判断栈是否为空,空则返回0,非空则将栈顶元素值赋值给另一个元素,将栈顶指针减一。
//退栈操作
int Pop(SeqStack &S, SElemType &x) //引用,则删除的是元素,而不是元素值
{
if(S.top = -1) return 0; //空栈
x = S.elem[S.top--];
return 1;
}
如果栈顶指针为-1则此栈为空。
如果栈的最大容量与当前元素个数相等则栈已满。