數據結構---鏈棧的基本操作


鏈棧的實現和表示

鏈棧是指采用鏈式存儲結構實現的棧。通常鏈棧用單鏈表來表示。
這里沒有頭結點,鏈表的頭部就是棧頂。

image-20220114144055141

鏈棧的存儲結構:

typedef struct StackNode

{

ElemType data;

struct StackNode *next;

} StackNode,*LinkStack;

1.初始化

算法思想:構造一個空棧,直接將棧頂指針置空

2.入棧

算法思想:為入棧元素動態分配一個結點空間(和順序棧不同的是,這是動態分配,不像順序棧得提前分配一個最大容量,后續加入元素直接再分配,不用考慮棧滿的情況)

算法步驟:

  • 為入棧元素 e 分配空間, 用指針 p 指向。
  • 將新結點數據域置為e。
  • 將新結點插入棧頂。(p->next=S;)
  • 修改棧頂指針為 p。(S=p;)
image-20220114145458557

3.出棧

算法思想:判斷棧是否為空,鏈棧在出棧后需要釋放出原棧元素的棧頂空間(先用了一個指針臨時保存了棧頂元素的空間,棧頂指針向下挪一位,原來棧頂空間需要被釋放)

算法步驟:

  • 判斷棧是否為空 , 若空則返回ERROR。
  • 將棧頂元素賦給e。(e=S->data;)
  • 臨時保存棧頂元素的空間, 以備釋放。(p=S;)
  • 修改棧頂指針, 指向新的棧頂元素。(S=S->next;)
  • 釋放原棧頂元素的空間。(delete p;)
image-20220114150548251

4.取棧頂元素

算法思想:當棧非空時, 此操作返回當前棧頂元素的值, 棧頂指針S保持不變。

6.判斷棧是否為空

算法思想:判斷棧頂指針即鏈表的頭指針是否指向空(S==NULL;)(這里不存在頭結點,所以不是判斷頭結點的指針域是否為空)

7.清空棧

算法思想:一個個刪除棧里的元素即出棧,直到棧為空(棧還存在)

8.銷毀棧

算法思想:一個個刪除棧里的元素即出棧,直到棧為空,最后再把棧頂指針指向的空間給釋放掉(棧不存在)

9.查看棧元素的個數

算法思想:再設置一個指向棧底元素的指針,兩個指針相減再加一就為棧元素個數,或者不另外設置指針,將棧頂指針向下挪,並設置同步計數變量,直至棧頂指針的指針域為空,返回計數變量的大小即為元素的個數。

10.遍歷棧

算法思想:設置一個指針p指向棧頂(和棧頂指針指向一致),不斷將p指針向下挪,同時打印p指針指向結點的數據域

代碼實現

#include<iostream>
using namespace std;
typedef struct node
{
	int data;
	struct node* next;
}Node, * stack;

//初始化棧
void initialsatck(stack& s)
{
	s = new Node;
	s->next = NULL;
}
//判斷棧是不是空的
bool isempty(stack& s)
{
	if (s== NULL)
	{
		cout << "棧不存在" << endl;
		exit(0);
	}
	if (s->next == NULL)
	{
		return true;
	}
	return false;
}
//入棧
void push(stack& s, int e)
{
	//先開辟一個空間存儲新的數據
	Node* p = new Node;
	p->data = e;
	p->next = s->next;
	s->next = p;
}

//出棧
int pop(stack& s)
{
	if (isempty(s))
	{
		exit(1);
	}
	Node* p = s->next;
	s->next = p->next;
	int e = p->data;
	delete p;        //清空取出數據的空間
	return e;
}
int getlength(stack& s) //取棧的地址,進行查看棧的長度
{
	Node* p = s;
	int length = 0;
	while (p->next != NULL)
	{
		p = p->next;
		length++;
	}
	return length;
}
//獲取棧頂元素
int gettop(stack& s)
{
	if (isempty(s))
	{
		exit(1);
	}
	return s->next->data;
}
//清空棧
void clearstack(stack& s)
{
	while (!isempty(s))
	{
		pop(s);
	}
}
//銷毀棧
void destorystack(stack& s)
{
	while (!isempty(s))
	{
		pop(s);
	}
	delete s;
	s = NULL;
}
void print(bool b)
{
	if (b)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
}
int main()
{
	stack s;
	initialsatck(s);

	for (int i = 0; i < 12; i++)
	{
		push(s, i);
	}
	cout << getlength(s) << endl;
	clearstack(s);
	cout << getlength(s) << endl;
	destorystack(s);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM