鏈棧之C++實現


          鏈棧是借用單鏈表實現的棧。其不同於順序棧之處在於:

1、鏈棧的空間是程序運行期間根據需要動態分配的,機器內存是它的上限。而順序棧則是

靜態分配內存的。

2、鏈棧動態分配內存的特性使得它一般無需考慮棧溢出的問題。

          鏈棧的的組織結構如下圖所示。容易發現其是架構的單鏈表的基礎之上的。

 

              下面介紹下我用C++實現的鏈棧,VC6下調試。

1、文件的組織結構

 

2、ls.h鏈棧類的說明

#ifndef _LS_H_
#define _LS_H_

typedef int dataType;

struct node                   //鏈棧節點
{
	dataType data;            //數據域
	node *next;               //指針域
};

class ls
{
public:
	ls();
	~ls();
	void push(dataType var); //壓棧
	void pop();              //出棧.出棧之前並不判斷棧是否已空.需要通過isEmpty()判斷
	dataType stackTop();     //取棧頂元素,棧頂無變化.不提前判斷棧是否為空
	bool isEmpty();          //判空.空返回true,反之返回false
	//bool isFull();         //判滿.鏈棧是動態分配內存空間的,無需判滿

private:
	node *top;               //棧頂指針.top=NULL表示為空棧
};

#endif


3、ls.cpp鏈棧類成員函數的定義

#include <iostream>
#include "ls.h"
using namespace std;

ls::ls()
{
	top = NULL;            //top=NULL表示鏈棧為空
}

ls::~ls()
{
	node *ptr = NULL;

	while(top != NULL)     //循環釋放棧節點空間
	{
		ptr = top->next;
		delete top;
		top = ptr;
	}
}

void ls::push(dataType var)
{
	node *ptr = new node;

	ptr->data = var;        //新棧頂存值
	ptr->next = top;        //新棧頂指向舊棧頂

	top = ptr;              //top指向新棧頂
}

void ls::pop()
{
	node *ptr = top->next;  //預存下一節點的指針
	delete top;             //釋放棧頂空間
	top = ptr;              //棧頂變化
}

dataType ls::stackTop()
{
	return top->data;       //返回棧頂元素,並不判斷棧是否已空
}

bool ls::isEmpty()
{
	return top == NULL;     //棧頂為NULL表示棧空
}


4、main.cpp

#include <iostream>
#include "ls.h"
using namespace std;

int main()
{
	ls exp;
	int i = 0;

	for(i=0;i<3;++i)
	{
		exp.push(i);
	}

	for(i=0;i<3;i++)
	{
		if(!exp.isEmpty())
		{
			cout<<exp.stackTop()<<endl;
			exp.pop();
		}
	}

	return 0;
}


免責聲明!

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



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