堆栈学习
栈特性:
- LIFO
- 简单实现可用结构中仅含top与size
数组实现:
tydef struct{
int top;
int val[maxsize];
}stk;
- 判断是否为空
bool isEmpty(stack *stk)
{
return stk->top==0;
}
- 入栈
void push(stack *stk,int x)
{
if(stk->top==MAXSIZE)
return;
stk->val[++stk->top]=x;
return;
}
- 出栈
int pop(stack *stk)
{
if(isEmpty(stack))
return;
return stk->val[stk->top--];
}
链表实现
对于C语言而言,数组实现的弊端在于初始时不一定能确定栈的大小。链表能实现栈,但我的疑惑在于,链表本身和栈似乎并不是同一种结构(似乎在定义上是分开的?不清楚其他语言中什么情况)。但链表既可以作为FIFO,也可以做LIFO的结构。和数组在C语言中都是实现更高级数据结构的基础。= =看来还有很多东西要去思考和学习一下。(因为今天看了一些C++和Java的实现,发现stack在其他语言中是一种单独的数据结构,而不需要借助数组或链表)
- 基本结构
typedef struct
{
int top;
Node* next;
}Stack;
- 判断是否为空
return node==NULL;
- 入栈
void StackPush(Stack *s, int top) //入栈
{
/*是否满栈检查*/
Node* tmpNode = (Node*)malloc(sizeof(*tmpNode));
tmpNode->top = top;
tmpNode->next = s;
s= tmpNode;
}
- 出栈
int StackPop(Stack *s)
{
/*是否为空检查*/
int x=s->pop;
s=s->next;
return x;
}
一些其他操作
- 用栈实现队列–再开栈–可递归或迭代
- 查找最小元素–在线处理–每一步都操作