基本数据结构与算法
(1)栈的基本操作
一.用数组实现
//定义节点结构
#define MaxSize <数组元素个数>
typedef struct sNode{
ElemType data[MaxSize];
int top;
}stack;
//创建栈
stack* createStack()
{
stack* s=(stack*)malloc(sizeof(stack));
s->top=-1;//数组下标为-1时代表为空栈
return s;
}
//压栈操作
void push (stack* ptrS,ElemType item)
{
if(ptrS->top==MaxSize-1)//数组下表从零开始,故判断MaxSize-1为栈满情况
{
printf("栈已满");
return;
}
else
{
//先让头部指针向上移动,再添加数据元素
ptrS->data[++top]=item;
return;
}
}
//出栈
ElemType pop(stack* ptrS)
{
if(ptrS->top==-1)
{
printf("栈已空");
return NULL;
}
else
{
//取得数据后让top向下移
return ptrS->data[ptrS->top--];
}
}
//判断栈是否为空
bool isEmpty(stack* ptrS)
{
if(ptrS->top==-1)
return true;
else
return false;
}
//判断栈是否已满
bool isFull(stack* ptrS)
{
if(ptrS->top==MaxSize-1)
return true;
else
return false;
}
//求栈的深度
int Size(stack* ptrS)
{
return ptrS->top+1;//数组从零开始,故需加一
}
//获取栈顶元素
ElemType top(stack* ptrS)
{
if(ptrS->top==-1)//栈为空
{
return NULL;
}
return ptrS->data[top];
}
用数组实现栈时由于要预先分配后好存储空间,故在大多数时候会造成空间资源的浪费,因此为了提高空间利用率,采用两个栈各自向中间延伸的方法。
#define MaxSize <数据最大存储量>
typedef struct sNode
{
ElemType data[MaxSize];
int top1;
int top2;
}stack;
void initStack(stack* ptrS)
{
ptrS->top1=-1;
ptrS->top2=MaxSize;
}
void push(stack* ptrS,ElemType item,int tag)
{/*tag作为标志,取值为1时向第一个栈中加入数据,为2时向第二个栈中加入数据*/
if(ptrS->top2-ptrS->top1==1)
{
printf("栈已满");
return;
}
else if(tag==1)
{
//和单一栈的操作一致
ptrS->data[++ptrS->top1]=item;
}
else if(tag==2)
{
//和单一栈的操作一致
ptrS->data[++ptrS->top2]=item;
}
}
ElemType pop(stack* ptrS,int tag)
{
if(tag==1)
{
if(ptrS->top1==-1)
{
printf("栈1已空");
return NULL;
}
else
return ptrS->data[ptrS->top1--];
}
else
{
if(ptrS->top2==MaxSize)
{
printf("栈2已满");
return NULL;
}
else
return ptrS->data[ptrS->top2--];
}
}
二.用链表实现
栈的链式存储结构实际上是一个单链表,栈的入栈与出栈只能在链表的头部进行。
//定义链表的栈节点
typedef struct sNode
{
ElemType Data;
sNode* next;
}stack;
/*构建一个链表头指针*/
stack* createStack()
{
stack* s=(stack*)malloc(sizeof(stack));
s->next=NULL;
return s;
}
void push(stack* ptrS,ElemType item)
{
//创建新的节点
stack* tmp=(stack*)malloc(sizeof(stack));
tmp->Data=item;//将数据元素赋值给新节点的数据域
tmp->next=ptrS->next;//将新节点的指针域指向下一节点
ptrS->next=tmp;//将头节点的指针域指向新节点
}
ElemType pop(stack* ptrS)
{
/*弹栈操作*/
ElemType elem;//存储弹栈数据
stack* p=ptrS->next;//创建临时指针指向弹栈节点
ptrS->next=p->next;//让头指针指向后一个节点
elem=p->Data;
free(p);//释放掉出栈后元素对应的内存空间
return elem;
}
bool isEmpty(stack* ptrS)
{
/*判断栈是否为空*/
if(ptrS->next==NULL)
return true;
else
return false;
}