堆疊也可以使用連結串列來實現,而不是只能使用陣列來實現。連結串列動態可以分配記憶體。 然而,兩種情況下的時間複雜度對於所有操作是相同的,即推入,彈出和窺視。
在堆疊的連結串列實現中,節點在儲存器中非連續地維護。 每個節點都包含一個指向堆疊中直接後繼節點的指標。 如果記憶體堆中剩餘的空間不足以建立節點,則稱堆疊溢位。
堆疊中最頂層的節點的地址欄位中始終包含null
。 下面來討論一下每個操作在堆疊的連結串列實現中執行的方式。
將節點新增到堆疊稱為推播操作。 在連結串列實現中將元素推播到堆疊不同於陣列實現的元素。 為了將元素推入堆疊,涉及以下步驟。
null
分配給節點的地址部分。時間複雜度: o(1)
C語言的程式碼實現
void push ()
{
int val;
struct node *ptr =(struct node*)malloc(sizeof(struct node));
if(ptr == NULL)
{
printf("not able to push the element");
}
else
{
printf("Enter the value");
scanf("%d",&val);
if(head==NULL)
{
ptr->val = val;
ptr -> next = NULL;
head=ptr;
}
else
{
ptr->val = val;
ptr->next = head;
head=ptr;
}
printf("Item pushed");
}
}
從堆疊頂部刪除節點稱為彈出操作。 從堆疊的連結串列實現中刪除節點與陣列實現中的節點不同。 要從堆疊中彈出元素,需要按照以下步驟操作:
null
,則堆疊將為空。時間複雜度:o(n)
C語言程式碼實現
void pop()
{
int item;
struct node *ptr;
if (head == NULL)
{
printf("Underflow");
}
else
{
item = head->val;
ptr = head;
head = head->next;
free(ptr);
printf("Item popped");
}
}
顯示堆疊的所有節點需要遍歷以堆疊形式組織的連結串列的所有節點。 為此,需要遵循以下步驟。
時間複雜度:o(n)
C語言的程式碼實現
void display()
{
int i;
struct node *ptr;
ptr=head;
if(ptr == NULL)
{
printf("Stack is empty\n");
}
else
{
printf("Printing Stack elements \n");
while(ptr!=NULL)
{
printf("%d\n",ptr->val);
ptr = ptr->next;
}
}
}
C語言完整的程式碼實現如下
#include <stdio.h>
#include <stdlib.h>
void push();
void pop();
void display();
struct node
{
int val;
struct node *next;
};
struct node *head;
void main()
{
int choice = 0;
printf("*********Stack operations using linked list*********\n");
printf("----------------------------------------------\n");
while (choice != 4)
{
printf("Chose one from the below options...\n");
printf("1.Push\n2.Pop\n3.Show\n4.Exit");
printf("Enter your choice \n");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
push();
break;
}
case 2:
{
pop();
break;
}
case 3:
{
display();
break;
}
case 4:
{
printf("Exiting....");
break;
}
default:
{
printf("Please Enter valid choice ");
}
};
}
}
void push()
{
int val;
struct node *ptr = (struct node*)malloc(sizeof(struct node));
if (ptr == NULL)
{
printf("not able to push the element");
}
else
{
printf("Enter the value");
scanf("%d", &val);
if (head == NULL)
{
ptr->val = val;
ptr->next = NULL;
head = ptr;
}
else
{
ptr->val = val;
ptr->next = head;
head = ptr;
}
printf("Item pushed");
}
}
void pop()
{
int item;
struct node *ptr;
if (head == NULL)
{
printf("Underflow");
}
else
{
item = head->val;
ptr = head;
head = head->next;
free(ptr);
printf("Item popped");
}
}
void display()
{
int i;
struct node *ptr;
ptr = head;
if (ptr == NULL)
{
printf("Stack is empty\n");
}
else
{
printf("Printing Stack elements \n");
while (ptr != NULL)
{
printf("%d\n", ptr->val);
ptr = ptr->next;
}
}
}