先使用数组模拟,以便了解,后期再继续写文章,完善链式的栈
栈的定义
栈是指限定仅在表尾进行插入和删除操作的线性表。所以它和前面的链表以及后面的队列一样,都是线性表,它们都有相同的逻辑结构
对于栈来说,它的表尾段有着特殊的含义(只能在表尾进行操作),因此我们称其为栈顶。同样的,它的首段则被称为栈底。不含元素的栈,我们一般称其为空栈
在我们日常生活中,类似栈的结构很常见,
比方说,在我们编写word文档时的撤销操作,就是栈的结构
其最下面的" 键入"1" "操作是我们最开始做的,而上面" 键入"回车" "(真的是回车,只是它没显示)的操作则是我们后进行的。因此,我们称" 键入"1" "为栈底元素,而" 键入"回车" "为栈顶元素。因此,栈又叫做后进先出(Last In First Out,LIFO)的线性表
定义
typedef struct
{
ElemType data[MaxSize];
int top;
} SqStack;
此处的data数组就是我们栈的空间,而top是栈顶指针
栈顶指针:S.top,初始化时设置为S.top==-1;此时,栈顶元素S.data[S.top]
出栈操作:栈不满时,栈顶指针先加一,再送值到栈顶
出栈操作:栈非空时,先去栈顶元素,再将栈顶指针减一
栈空条件:S.top==-1;
栈满条件:S.top==MaxSize-1;
栈长:S.top+1;
初始化
void InitStack(SqStack &S)
{
S.top = -1;
}
判空
bool StackEmpty(SqStack S)
{
if (S.top == -1)
{
return true;
}
else
{
return false;
}
}
进栈
bool Push(SqStack &S, ElemType x)
{
if(S.top==MaxSize-1)
{
return false;
}
S.data[++S.top] = x;
return true;
}
如果说,此时栈不满,那么在入栈之前需要将top指针加一,才能入栈
出栈
bool Pop(SqStack &S, ElemType &x)
{
if (S.top == -1)
{
return false;
}
x = S.data[S.top--];
// x = S.data[S.top];
// S.top--;
return true;
}
读栈顶元素
bool GetTop(SqStack &S, ElemType &x)
{
if(S.top==-1)
{
return false;
}
x = S.data[S.top];
return true;
}
出栈和读栈顶元素的区别:
就栈顶指针的位置没有发生变化,读栈顶元素就只是读了一下栈顶的元素,并没有将其弹出;而出栈的操作移动了指针,同时也读取了栈顶元素
此处的top指的是栈顶元素,所以,进栈操作为S.data[++S.top] = x,出栈操作为x = S.data[S.top--]。如果栈顶指针初始化为S.top=0(即top指针指向栈顶元素的下一位置),入栈操作就会变成S.data[S.top++] = x,出栈操作为x = S.data[--S.top],同时栈空和满栈的条件也会发生变化。