1. 程式人生 > >資料結構——鏈棧

資料結構——鏈棧

//LinkStack.h
#include<iostream>
#include<cstdlib>
#define ERROR -1
#define OK 1
#define TRUE 0
#define FALSE -2
using namespace std;
typedef int SElemType;
typedef int Status;
typedef struct SNode
{
	SElemType data;
	struct SNode *next;
}SNode,*UnitStack;
class LinkStack
{
public:
	LinkStack();//構造
	~LinkStack();//銷燬
	Status InputStack(SElemType e);//輸入
	Status DeStack(SElemType &e);//刪除
	int StackLength();//返回鏈棧長度
	Status StackEmpty();//判斷空戰
	Status GetStack(SElemType &e);//返回棧頂
	Status ClearStack();//清空鏈棧
private:
	UnitStack top;
};
//LinkStack.cpp
#include "LinkStack.h"
LinkStack::LinkStack()
{	//建立鏈棧
	top = (UnitStack)malloc(sizeof(SNode));
	if (!top)
	{
		cout << "鏈棧建立失敗!退出......" << endl;
		return;
	}
	top->next = NULL;
	cout << "鏈棧建立成功!!!" << endl;
}//LinkStack


LinkStack::~LinkStack()
{	//銷燬
	UnitStack s;
	while (top)
	{
		s = top->next;
		top->next = s->next;
		free(s);
	}
	cout << "銷燬成功!" << endl;
}//~LinkStack
Status LinkStack::InputStack( SElemType e)
{	//輸入
	UnitStack s;
	s = (UnitStack)malloc(sizeof(SNode));
	if (!s)
	{
		cout << "入棧失敗!" << endl;
		return ERROR;
	}
	s->data = e;
	s->next = top->next;
	top->next = s;
	return OK;
}//InputStack
Status LinkStack::DeStack( SElemType &e)
{	//刪除
	UnitStack s;
	if (top->next==NULL)
	{
		cout << "空棧!!!" << endl;
		return ERROR;
	}
	s = top->next;
	top->next = s->next;
	e = s->data;
	free(s);
	return OK;
}//DeStack
int LinkStack::StackLength()
{	//返回鏈棧長度
	int Length=0;
	UnitStack s;
	s = top->next;
	while (s)
	{
		Length++;
		s = s->next;
	}
	return Length;
}//StackLength
Status LinkStack::StackEmpty()
{	//判斷空戰
	if (!top->next)return TRUE;
	return FALSE;
}//LinkStack
Status LinkStack::GetStack(SElemType &e)
{	//返回棧頂
	UnitStack s;
	if (!top->next)
	{
		cout << "空棧!!!" << endl;
		return ERROR;
	}
	s = top->next;
	e = s->data;
	return OK;
}//GetStack
Status LinkStack::ClearStack()
{	//清空鏈棧
	top->next = NULL;
	return OK;
}
//源.cpp
#include"LinkStack.h"
int main()
{
	LinkStack LS;
	SElemType e=0;
	int c = 0;
	cout << "輸入入棧元素(輸入-1結束):" << endl;
	cin >> e;
	while (e!=-1)
	{	
		if (LS.InputStack(e) != OK)return 0;
		cin >> e;
	}
	if(LS.StackEmpty()!=TRUE) cout << "入棧成功!!!" << endl;
	while (1)
	{
		cout << "插入 1;刪除 2;鏈棧長度 3;返回棧頂 4;清空 5;退出 9;" << endl;
		cin >> c;
		switch (c)
		{
		case 1:
			cout << "輸入插入元素:";
			cin >> e;
			if (LS.InputStack(e) == OK) cout << "插入成功!" << endl;
			break;
		case 2:
			if(LS.DeStack(e)==OK)
			cout << "刪除成功,刪除元素為:" << e << endl;
			break;
		case 3:
			cout << "鏈棧長度為:" << LS.StackLength() << endl;
			break;
		case 4:
			if (LS.GetStack(e) == OK) 
			{
				cout << "棧頂元素為:" << e << endl;
			}
			break;
		case 5:
			LS.ClearStack();
			cout << "清空完成!!!" << endl;
			break;
		case 9:
			cout << "退出......" << endl;
			goto part;
			break;
		default:
			cout << "輸入錯誤!!!" << endl;
			break;
		}
	}
	part:
	return 0;
}