(一)栈的定义
一种特殊的线性表。只能在一端进行插入和删除的线性结构
(二)栈的顺序存储结构及其基本运算的实现
//栈可以用顺序存储结构,分配一块连续的内存存放栈中元素,用一个变量指向栈顶元素以反映栈中元素变化
//可以用下列方式定义顺序栈
struct
{
ElemType data[MaxSize];
int top; //栈顶指针
}SqStack; //定义的顺序栈类型
/**************************初始化栈*****************************/
void InitStack(SqStack* &s) //建一个新的空栈,实际把栈顶指针指-1即可
{
s = (SqStack*)malloc(sizeof(SqStack));
s->top = -1;
}
/***********************释放栈*的存储空间**************************/
void DestroyStack(SqStack* &s)
{
free(s);
}
/*************************判断栈是否为空******************/
//栈空的条件是s->top==-1
bool StackEmpty(SqStack* &s)
{
return (s->top == -1);
}
/************************进栈********************************/
//在栈不满的情况下,先将栈顶指针加一,然后在栈顶指向插入元素e
bool Push(SqStack* &s, ElemType e)
{
if (s->top == MaxSize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}
/***********************出栈********************/
//在栈不为空的情况下,先将栈顶元素赋给e,然后将栈顶指针减1
bool Pop(SqStack* &s, ElemType& e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}
/**************取栈顶元素*************************/
//在栈不空的情况下,将栈顶元素赋给e
bool getTop(SqStack* &s, ElemType& e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}
(三)栈的链式存储结构及其基本运算的实现
链栈的优点是不存在栈满上溢
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
using namespace std;
struct Link
{
int data;
struct Link* next;
};
struct Stack
{
struct Link* head;
int size;
};
void StackInit(struct Stack* stack)
{
stack->head = nullptr;
stack->size = 0;
}
void StackPush(struct Stack* stack, const int data)
{
struct Link* node = (struct Link*)malloc(sizeof(struct Link));
assert(node != nullptr); //注意细节
node->data = data;
node->next = stack->head;
stack->head = node;
++stack->size;
}
bool StackEmpty(struct Stack* stack)
{
return stack->size == 0;
}
int StackPop(struct Stack* stack, int &data) //我们希望显示出栈弹出懂得内容
//函数体内的stack和data一直在变
//该函数的参数还可以这样改,(struct Stack* stack, int *data)
//这样以来形参*data对应的实参改为data
//复习下C/C++中传值,传地址,传指针,看我的这篇博客
//https://blog.csdn.net/qq_34793133/article/details/80819690
{
if (StackEmpty(stack))
return 0;
struct Link* tmp = stack->head;
data = tmp->data;
stack->head = stack->head->next;
--stack->size;
free(tmp);
return 1;
}
void StackCleanUp(struct Stack* stack)
{
struct Link* tmp;
while (stack->head != nullptr)
{
tmp = stack->head;
stack->head = stack->head->next;
free(tmp);
}
stack->size = 0;
}
int main()
{
struct Stack stack;
StackInit(&stack);
int i;
for (i = 0; i < 5; ++i) //栈中依次压入0 1 2 3 4
{
StackPush(&stack, i);
}
while (!StackEmpty(&stack)) //应该弹出4 3 2 1 0
{
StackPop(&stack, i);
printf("%d ", i);
}
printf("\n");
return 0;
}