1. 程式人生 > >棧和佇列(用C++實現棧和佇列)

棧和佇列(用C++實現棧和佇列)

棧是一種後進先出的線型結構,C++實現棧的程式碼如下:

#include <iostream>
using namespace std;
#define MAXLEN 50
typedef struct
{
	char key[10];
	char name[20];
	int age;
}Data;
typedef struct
{
	Data nodeData[MAXLEN+1];
	int top;
}StackType;
void STInit(StackType &ST)//ST前一定要加上&,因為傳入的是定義的ST本身,而不是隻傳入ST的值
{
	ST.top = -1;
}
void STPush(StackType &ST,Data nodeData)
{
	ST.nodeData[ST.top+1]=nodeData;
	ST.top++;
}
int STIsFull(StackType &ST)
{
	if(ST.top==MAXLEN)
		return 1;
	else
		return 0;
}
int STIsEmpty(StackType &ST)
{
	if(ST.top == -1)
		return 1;
	else
		return 0;
}
void ClearStack(StackType &ST)
{
	ST.top =-1;
	cout<<"clear the stack!!"<<endl;
}
void STShow(StackType &ST)
{
	cout<<"*******Show the Stack*******"<<endl;
	for(int i=0;i<=ST.top;i++)
	{
		cout<<"index:"<<i<<" "<<"key:"<<ST.nodeData[i].key<<" "<<"name:"<<ST.nodeData[i].name<<" "<<"age:"<<ST.nodeData[i].age<<endl;
	}
	cout<<"****************************"<<endl;
}
void STPop(StackType &ST)
{
	ST.top--;
}
int main()
{
	StackType ST;
    STInit(ST);
	if(STIsEmpty(ST))
		cout<<"Empty!!"<<endl;
	STShow(ST);
	Data nodeData;
	strcpy(nodeData.key,"No.1");
	strcpy(nodeData.name,"hahaha");
	nodeData.age = 21;
	STPush(ST,nodeData);
	strcpy(nodeData.key,"No.2");
	STPush(ST,nodeData);
	strcpy(nodeData.key,"No.3");
	STPush(ST,nodeData);
	STShow(ST);
	STPop(ST);
	STShow(ST);
	ClearStack(ST);
	STShow(ST);
}


佇列是一種只在一斷進入,只在另一端出的線型結構,C++實現佇列的程式碼如下:
/*
	QUEUE
	front指向首元素
	tail指向尾元素的下一位置
*/
#include<iostream>
using namespace std;
#define MAXLEN 5
typedef struct
{
	char key[10];
	char name[20];
	int age;
}Data;
typedef struct
{
	Data nodeData[MAXLEN];
	int front;
	int tail;
}QType;
void QInit(QType &QT)
{
	QT.front=0;
	QT.tail=0;
	cout<<"QUEUE have been init!!"<<endl;
}
void QShow(QType &QT)
{
	cout<<"*****Show the QUEUE!!!*****"<<endl;
	for(int i=QT.front;i<QT.tail;i++)
	{
		cout<<"index:"<<i<<" "<<"key:"<<QT.nodeData[i].key<<" "<<"name:"<<QT.nodeData[i].name<<" "<<"age:"<<QT.nodeData[i].age<<endl;
	}
	cout<<"***************************"<<endl;
}
int QIsEmpty(QType &QT)
{
	if(QT.front == QT.tail)
		return 1;
	else
		return 0;
}
int QIsFull(QType &QT)
{
	if(QT.tail == MAXLEN)
		return 1;
	else 
		return 0;
}
void ClearQueue(QType &QT)
{
	QT.front = 0;
	QT.tail = 0;
	cout<<"QUEUE is already clear!!"<<endl;
}
void QPush(QType &QT,Data nodeData)
{
	QT.nodeData[QT.tail] = nodeData;
	QT.tail++;
}
void QPop(QType &QT)
{
	QT.front++;
}
int QLength(QType &QT)
{
	return QT.tail - QT.front;
}
int main()
{
	Data DL[5]={{"No.1","hahaha",21},
				{"No.2","lalala",32},
				{"No.3","mememe",123},
				{"No.4","sasasa",1231244},
				{"No.5","momomo",5432}};
	QType QT;
	QInit(QT);
	QShow(QT);
	QPush(QT,DL[0]);
	QShow(QT);
	QPush(QT,DL[1]);
	QPush(QT,DL[2]);
	QPush(QT,DL[3]);
	QPush(QT,DL[4]);
	if(QIsFull(QT))
	{
		cout<<"FULL!!"<<endl;
	}
	QShow(QT);
	QPop(QT);
	QShow(QT);
	cout<<"QUEUE length:"<<QLength(QT)<<endl;
	ClearQueue(QT);
	QShow(QT);
	return 0;
}