什么是栈?简单的说是一个后进先出的表,类似于弹夹,后入的子弹先打出来。
下面是栈的一些具体操作步骤:
首先是栈的结构定义:
typedef int SElemType;
typedef struct {
int data[MAXSIZE];
int top; /*用于栈顶标记*/
}SqStack, *Sq;
栈的初始化、创建操作:
Sq initStack(Sq S){
S = (Sq)malloc(sizeof(SqStack));
if(!S){
printf("创建失败!!");
exit(0);
}
S->top = -1;
printf("栈创建成功!!");
return S;
}
栈的压入操作:
bool PushStack(Sq S, SElemType e){
if(S->top == MAXSIZE - 1){
printf("该栈已满,不能再追加!!");
return false;
}
S->top++;
S->data[S->top] = e;
return true;
}
栈的弹出操作:
int PopStack(Sq S){
if(S->top == -1){
printf("该栈是空的,没有元素可以删除!!");
return false;
}
SElemType e = S->data[S->top--];
return e;
}
有时候我们需要俩个空间需求相反的栈,我们会使用栈的空间共享结构:
这种结构将数组分为俩部分,一栈和二栈,采用俩个栈顶标记,一个标记在前面,一个标记在后面。
下面是具体的操作:
结构体定义操作:
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack, *SqDu;
初始化、创建操作:
SqDu InitStack(SqDu q){
q = (SqDu)malloc(sizeof(SqDoubleStack));
if(!q){
printf("该栈创建失败!!\n");
exit(0);
}
printf("该栈创建成功!!\n");
q->top1 = -1;
q->top2 = MAXSIZE;
return q;
}
压入操作:
void PushStack(SqDu q, ElemType e, ElemType stack_number){
if(q->top1 + 1 == q->top2){
printf("该栈已满,不能继续添加元素\n");
exit(0);
}
if(stack_number == 1){
q->data[++q->top1] = e;
printf("元素压入成功!!\n");
}else{
q->data[--q->top2] = e;
printf("元素压入成功!!\n");
}
}
弹出操作:
int PopStack(SqDu q, ElemType stack_number){
if(stack_number == 1){
if(q->top1 == -1){
printf("该栈为空!!");
}else{
ElemType e = q->data[q->top1--];
printf("元素弹出成功\n");
return e;
}
}else{
if(q->top2 == MAXSIZE){
printf("该栈为空!!");
}else{
ElemType e = q->data[q->top2++];
printf("元素弹出成功!!\n");
return e;
}
}
}