c++實現鏈棧的基本操作(附帶main函式 可編譯執行)
阿新 • • 發佈:2019-01-09
資料結構老師佈置了鏈棧的基本操作,讓我們儘量嘗試用class實現,然後我在網上參考了一部分,自己寫了一個,有不足之處懇請大家指出
/*
* 檔名:鏈棧.c* 鏈棧的實現
* 版本:2.0
* 時間:2016.11.4
* 作者:WangYan
* 假定條件: 假設元素的基本型別為int,且每個元素只有一個整數資訊需要壓棧
*
*/
#include<iostream>
#define OK 1
#define ERROR -1
using namespace std;
typedef int Elemtype;
typedef struct Stacknode
{
Elemtype data;
struct Stacknode *next;
}snode;
class LinkStack
{
public:
LinkStack();
int Push(Elemtype data); //進棧
int Pop(); //出棧 Elemtype &data
int Clear(); //清空鏈棧
bool isEmpty(); //判空
int print() const; //列印鏈棧內元素
~LinkStack(); //析構,銷燬
static int Count; //存放棧的大小
snode *top; //棧頂指標
//protected:
};
/**初始化棧的長度*/
int LinkStack::Count = 0;
/***********************
初始化鏈棧
呼叫建構函式
***********************/
LinkStack::LinkStack()
{
top = NULL; //top = NULL表示鏈棧為空
}
/***********************
銷燬鏈棧
解構函式
***********************/
LinkStack::~LinkStack()
{
snode *p = NULL;
while(top) //迴圈釋放節點
{
p = top->next;
delete top;
top = p;
}
}
/***********************
進棧操作
Push
data為進棧的資料
***********************/
int LinkStack::Push(Elemtype data)
{
snode *snew = new snode; //建立新節點
snew->data = data; //新節點賦值
snew->next = top; //新棧頂指向舊棧頂
top = snew; //top指向新棧頂
Count ++;
return OK;
}
/***********************
出棧操作
Pop
***********************/
int LinkStack::Pop()
{
if(!top)
return ERROR;
if(isEmpty() == 1)
{
cout<<"棧為空"<<endl;
return OK;
}
snode *p = top->next; //預存下一節點的指標
//data = top->data; //將棧頂元素返回給主函式使用
delete top; //釋放棧頂空間
top = p; //棧頂下移
Count --;
return OK;
}
/***************
判斷鏈棧是否為空
IsEmpty
****************/
bool LinkStack::isEmpty()
{
return (top == NULL); //棧頂為空則返回1 ,不為空返回0
}
/***********************
清空鏈棧
Clear
形式同解構函式
***********************/
int LinkStack::Clear()
{
snode *p;
while(top) //迴圈釋放節點
{
p = top;
top = top->next;
delete p;
}
return OK;
}
/***********************
列印鏈棧中元素
通過遍歷鏈棧列印元素值
***********************/
int LinkStack::print() const
{
snode *p = top;
while(p && Count) //棧不為空 && 棧中存在資料
{
cout<<p->data<<ends<<ends; //遍歷列印棧中資料
p = p->next;
}
return OK;
}
int main()
{
LinkStack ls; //定義物件 ls
int x; //選擇數,兼輸入鏈棧的元素值
cout<<"******************************* "<<endl;
cout<<"請選擇要進行的操作: "<<endl;
cout<<"初始化 "<<endl;
cout<<"1: 壓棧 "<<endl;
cout<<"2:出棧 "<<endl;
cout<<"3:判斷鏈棧是否為空 "<<endl;
cout<<"4:清空鏈棧 "<<endl;
cout<<"5:顯示鏈棧長度 "<<endl;
cout<<"6:列印鏈棧 "<<endl;
cout<<"銷燬鏈棧"<<endl;
cout<<"******************************* "<<endl;
cout<<"請輸入要進行的操作:"<<endl;
while(cin>>x)
{
switch (x)
{
case 1:
cout<<"輸入壓棧資料:(末尾輸入0結束)"<<endl;
cin>>x;
while(x)
{
ls.Push(x);
cin>>x;
}
cout<<endl<<"請輸入下一步操作:";
break;
case 2:
if(ls.isEmpty())
cout<<"鏈棧為空棧"<<endl;
while(ls.top)
{
ls.Pop();
}
cout<<endl<<"請輸入下一步操作:";
break;
case 3:
if(ls.isEmpty())
cout<<"鏈棧為空棧"<<endl;
else
cout<<"鏈棧不為空"<<endl;
cout<<endl<<"請輸入下一步操作:";
break;
case 4:
ls.Clear();
cout<<endl<<"請輸入下一步操作:";
break;
case 5:
cout<<ls.Count<<endl;
cout<<endl<<"請輸入下一步操作:";
break;
case 6:
if(ls.isEmpty())
cout<<"鏈棧為空棧"<<endl;
else
ls.print();
cout<<endl<<"請輸入下一步操作:";
break;
default: break;
}
}
return 0;
}