和隊列一樣,堆棧也是一個對操作有一定約束的線性表,進棧時只能在一端進行,出棧在另一端進行。就如同一疊盤子,先放的最後拿出來,最後放的最先拿出來,具有先入後出的特徵。下面是堆棧的順序存儲實現和鏈式存儲實現。
1、堆棧的順序存儲實現
(1)數據結構
typedef struct Stack{
int Data[MAXSIZE];
int top;
}stack;
(2)一般操作
bool isFull(stack *s); --判斷堆棧是否滿
bool isEmpty(stack *s); --判斷堆棧是否爲空
stack* createStack(); --創建一個堆棧
void Push(stack *s,int elem); --將元素入棧
int Pop(stack *s); --出棧
(3)具體實現
bool isFull(stack *s)
{
if(s->top==MAXSIZE)
return true;
else
return false;
}
bool isEmpty(stack *s)
{
if(s->top==-1)
return true;
else
return false;
}
stack* createStack()
{
stack *s;
s=(stack*)malloc(sizeof(stack));
s->top=-1;
return s;
}
void Push(stack *s,int elem)
{
int i=s->top;
if(!isFull(s))
{
s->Data[i+1]=elem;
s->top+=1;
}
else
{
printf("no enough space to push\n");
}
}
int Pop(stack *s)
{
if(isEmpty(s))
{
printf("no element in stack");
}
else
{
int i=s->top;
s->top-=1;
return s->Data[i];
}
return 0;
}
int main()
{
stack *s=createStack();
int i;
for(i=0;i<10;i++)
Push(s,i);
for(i=0;i<=s->top;i++)
printf("data=%d,top=%d\n",s->Data[i],s->top);
int p;
while(s->top)
{
p=Pop(s);
printf("pop=%d,top=%d\n",p,s->top);
}
return 0;
}
2、堆棧的鏈式存儲
(1)數據結構
typedef struct Node{
int data;
struct Node* next;
}stack;
(2)一般操作
bool isEmpty(stack *s); --判斷堆棧是否爲空
stack* createStack(); --創建一個堆棧
void Push(stack *s,int elem); --將元素入棧
int Pop(stack *s); --出棧
(3)具體實現
bool isEmpty(stack *s)
{
if(s->next==NULL)
return true;
else
return false;
}
stack* createStack()
{
stack *s;
s=(stack*)malloc(sizeof(stack));
s->next=NULL;
return s;
}
void Push(stack *s,int elem)
{
stack *q;
q=(stack*)malloc(sizeof(stack));
q->data=elem;
q->next=s->next;
s->next=q;
}
int Pop(stack *s)
{
stack *p;
int i;
if(!isEmpty(s))
{
p=s->next;
s->next=p->next;
i=p->data;
free(p);
return i;
}
else
{
printf("the stack is empty\n");
}
}
int main()
{
int i;
stack *s=createStack();
printf("進棧順序:\n");
for(i=0;i<10;i++)
{
printf("%d ",i);
Push(s,i);
}
printf("\n出棧順序:\n");
for(i=0;i<10;i++)
{
int ret=Pop(s);
printf("%d ",ret);
}
return 0;
}