您的位置:首页 > 其它

堆栈的两种实现形式:数组和链表

2010-07-16 01:05 295 查看
最近做一个图像处理项目,要对获取的种子点进行区域生成,想到了利用堆栈了实现,但是基本上忘光了,复习了一下,实现了堆栈的两种显示和一些常用的操作。堆栈可以用数组实现,缺点是数组实现会限制堆栈的大小,而链表实现不存在这种情况。

1.堆栈的数组实现

#include<iostream>
#define MAX_SIZE 3

struct Stack
{
int* data;
int st;
};

bool push(Stack* s,int x)
{
if(s->st<MAX_SIZE)
{
s->data[s->st++]=x;
return true;
}
else
return false;
}

int pop(Stack* s)
{
int popData=0;
if(!s)
return 0;
if(s->st<0)
return 0;
return s->data[--s->st];
}
bool isEmpty(Stack* s)
{
return s->st==0;
}
bool isFull(Stack* s)
{
return s->st==MAX_SIZE;
}


在该实现中,我采用了指针的数组,如果喜欢也可以直接用数组的形式。

2.链表的实现

#include<iostream>
struct Node
{
int x;
int y;
struct Node* next;
};
typedef struct Node Item;

struct Stack
{
int len;
Item* top;
Item* data;
};
/*
void initStack(Stack* pStack)
{
pStack=new Stack();
pStack->len=0;
pStack->data=new Item();
pStack->top=pStack->data;
}
*/
bool pop(Stack* p,Item& item)
{
if(p->len==0)
return false;

item.x=p->top->x;
item.y=p->top->y;
item.next=p->top->next;
p->top=p->top->next;

p->len--;

return true;
}
bool isEmpty(Stack* pStack)
{
using namespace std;
if(pStack->len==0)
{
cout<<"true"<<endl;
return true;
}
else
{
cout<<"false"<<endl;
return false;
}
}
bool push(Stack* p,Item& item)
{
Item* pNewItem=new Item();
pNewItem->x=item.x;
pNewItem->y=item.y;
pNewItem->next=p->top;
p->top=pNewItem;
p->len++;

return true;
}


在实现代码中其实data指针完全可以去掉,因为在这些代码中可以发现data完全没气作用,但是当初写的时候有,后来也就懒得去掉了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: