栈(FILO)
数组栈:数组加栈顶下标======默认栈底为arr[0],
#define size 10 //容量
typedef int DataType;
typedef struct//数组栈
{
DataType data[size];
int top;//栈顶指针
}sqStack;
//===================push压栈操作
bool Mypush(sqStack *sta,DataType elem)
{
if (sta->top == size-1)//top指向栈顶,栈已经满了
return false;
else
{
s->top++;//压入一个之前,栈顶下标加1
s->data[s->top]=elem;
return true;
}
}
//========pop出栈(有的分成了两步一个pop弹出,一个top返回顶部的值)
bool Mypop(sqStack *sta,DataType *elem)//利用指针把栈顶的值带出来
{
if(s->top ==-1)//数组栈为空
return false;
else
{
*elem=s->data[s->top];
s->top--;
return true;
}
}
链式栈:链表加栈顶指针
typedef int DataType;
typedef struct Node//单链表---- 一个节点
{
DataType data;
struct Node *next;
}Node, *Nodeptr;
typedef struct LinkStack//链式栈
{
Node* top_ptr; //等价于Nodeptr top;=======相当于头结点
int count;
}LinkStack;
//================push压栈
bool Mypush(LinkStack *stack,DataType elem)
{
if (!stack)
return false;
Node* node=(Node *)malloc(sizeof(Node));//分配一个新的节点空间
node->data=elem;
node->next=stack->top_ptr;//当前栈指针(指向的是一个节点) 赋值给
stack->top_ptr = node;// 刚刚建立的新节点下一个节点的地址 赋值给 链式栈的栈顶指针
stack->count++;
return true;
}
//=================pop出栈
bool Mypop(LinkStack *stack,DataType *elem)
{
if (StackEmpty(*stack))
return false;
else
{
Node *node;
*elem=stack->top_ptr->data;
node=stack->top_ptr;//栈指针赋给新节点的地址
stack->top_ptr=stack->top_ptr->next;//sp下移一位,指向后一节点
stack->count--;
return true;
}
}