数据结构再学习--栈的链表实现
2016-06-09 01:24
483 查看
栈是一种很基本的数据结构,就是一个线性表和栈索引值,因为线性表可以用数组和链表实现,这里的是用链式线性表实现了一个操作。在某些特殊的情况下很可能需要把两个栈合成一个栈,两个指针从两端向中间靠拢。所有完整代码:https://github.com/xiaobai1993/XBDataStructNote
#include "XBLinkStack.h"
void initLinkStack(XBLinkStack * statck)
{
if (statck==NULL) {
return;
}
statck->top = -1;
initXBLinkNode(&(statck->linkStackP));//初始化这个链表
}
int isLinkStackEmpty(XBLinkStack * statck)
{
return statck->top==-1;
}
void pushLinkStack(XBLinkStack * stack,DATATYPE data)
{
stack->top+=1;
addItemToXBLinkNode(&(stack->linkStackP), data);
}
void popLinkStack(XBLinkStack *stack,DATATYPE * data)
{
if (!isLinkStackEmpty(stack)) {
getItemFromXBLinkNodeByIndex(stack->linkStackP, stack->top, data);
stack->top--;
}
}
下面是普通的栈和共享栈
typedef struct
{
DATATYPE data[MAX_SIZE];
int top;//栈顶的指针
}XBStack;
typedef struct
{
DATATYPE data[MAX_SIZE];
int top1;
int top2;
}XBShareStack;
#include "XBLinkStack.h"
void initLinkStack(XBLinkStack * statck)
{
if (statck==NULL) {
return;
}
statck->top = -1;
initXBLinkNode(&(statck->linkStackP));//初始化这个链表
}
int isLinkStackEmpty(XBLinkStack * statck)
{
return statck->top==-1;
}
void pushLinkStack(XBLinkStack * stack,DATATYPE data)
{
stack->top+=1;
addItemToXBLinkNode(&(stack->linkStackP), data);
}
void popLinkStack(XBLinkStack *stack,DATATYPE * data)
{
if (!isLinkStackEmpty(stack)) {
getItemFromXBLinkNodeByIndex(stack->linkStackP, stack->top, data);
stack->top--;
}
}
下面是普通的栈和共享栈
typedef struct
{
DATATYPE data[MAX_SIZE];
int top;//栈顶的指针
}XBStack;
typedef struct
{
DATATYPE data[MAX_SIZE];
int top1;
int top2;
}XBShareStack;
void initStack(XBStack * statck) { statck->top = -1; } int isEmpty(XBStack * statck) { return statck->top==-1; } int isFull(XBStack * stack) { return stack->top==MAX_SIZE-1; } void push(XBStack * stack,DATATYPE data) { if (!isFull(stack)) { stack->top+=1; stack->data[stack->top]= data; } } void pop(XBStack *stack,DATATYPE * data) { if (!isEmpty(stack)) { *data = stack->data[stack->top]; stack->top--; } } //-------共享栈 //共享栈是两个栈,简化就是用了两个top标记和一个数组,一个初始值为0,另一个为数组的MAX_SIZE-1 //**********通常用于解决两个栈的空间有相反需求的关系,而且数据类型是相同的类型 //压入共享栈 int PushShareStatck(XBShareStack *stack,DATATYPE data,int stackNumber) { if (stack->top1+1==stack->top2) {//满了 return FAIL; } if (stackNumber==1) {//表示栈1元素入栈 stack->data[++stack->top1] = data; } else if(stackNumber==2) { stack->data[--stack->top2]=data; } return SUCCESS; } int PopShareStack(XBShareStack *stack,DATATYPE * obj,int stackNumber) { if (stackNumber==1) { if (stack->top1==-1) { return FAIL; } *obj=stack->data[stack->top1--]; return SUCCESS; } else if(stackNumber==2) { if (stack->top2==MAX_SIZE) { return FAIL; } *obj = stack->data[stack->top2++]; } return SUCCESS; }