鏈棧:采用鏈表作為儲存結構的棧,為操作方便,一般采用帶頭結點的單鏈表。
鏈表的表頭指針作為棧頂指針
鏈棧的結構定義如下:
typedef struct node
{
StackElementType data;
stuct node *next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;
鏈棧進棧操作
int Push(LinkStack top,StackElementType x)
{
LinkStackNode *temp;
temp=(LinkStackNode *)malloc(sizeof(LinkstackNode));
if(temp==NULL)
return(FALSE);//申請空間失敗
temp->data=x;
temp->next=top->next;
top->next=temp;//修改當前棧頂元素
return(TRUE);
}
鏈棧出棧操作
int Pop(LinkStack top,StackElementType *x)
{
LinkStackNode *temp;
temp=top->next;
if(temp==NULL)
return(FALSE);//棧為空
top->next=temp->next;
*x=temp->data;
free(temp);//釋放存儲空間
return(TRUE);
}
運用多個單鏈表,可以實現多個鏈棧(將多個鏈棧的棧頂指針放到一個一維指針數組中統一管理)
定義結構入如下:
#define M 10 //假設定義10個鏈棧
typedef stuct node
{
StackElementType data;
struct node *next;
}LinkStackNode *LinkStack;
linkStack top[M];
第i號的進棧操作
int pushi(LinkStack top[M],int i,StackElementType x)
{
LinkStackNode *temp;
temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp==NULL)
return(FALSE);
temp->data=x;
temp->next=top[i]->next;
top[i]->next=temp;
return(TRUE);
}
第i號棧元素的出棧操作
int Pop(LinkStack top[M],int i,StackElementType *x)
{
LinkStackNode *temp;
temp=top[i]->next;
if(temp==NULL)
return(FALSE);
top[i]->next=temp->next;
*x=temp->data;
free(temp); //釋放存儲空間
return(TRUE);
}