1. 程式人生 > >使用兩個棧實現一個佇列

使用兩個棧實現一個佇列

4、程式碼實現 這裡使用第二種優化方法倆實現兩個棧實現一個佇列的操作,下面我將按照下面步奏實現上述操作; (1)利用前插法建立鏈式棧liststack: (2)建立likequeue類封裝兩個鏈式棧liststack,設定成員函式popqueue()pushqueue()來分別實現佇列的壓入操作和彈出操作,其中成員函式S1insertS2()是把插入棧S1中的元素倒入S2中的操作函式,程式碼如下:
#include<iostream>
#include <assert.h> 
using namespace std;

struct node
{
	int data;
	node* link;
	node(const int &T, node* p = NULL){ data = T, link = p; };
};
//建立鏈式棧
class liststack
{
public:
	liststack();
	~liststack();
	void push(int);
	bool pop();
	node* gettop();
	bool isempty();
	void MarkEmpty();
	friend ostream& operator<<(ostream& os, liststack&TEST);
private:
	node* top;
};

liststack::liststack()
{
//不需要附加頭
	top =NULL;
}

liststack::~liststack()
{
	MarkEmpty();
}

void liststack::push(int temp)
{
	if (!isempty())
	{
		node* newnode = new node(temp);
		assert(newnode!=NULL);
		newnode->link = top;
		top = newnode;
	} 
	else
	{
		node* newnode = new node(temp);
		assert(newnode != NULL);
		newnode->link = NULL;
		top = newnode;
	}
}

bool liststack::pop()
{
	if (isempty()) return false;
	
	else
	{
		node* newnode = top;
		top=top->link;
		delete newnode;
		return true;
	}
}

void liststack::MarkEmpty()
{
   	while (top!=NULL)
	{
		node* newnode = top;
		top = top->link;
		delete newnode;
	}
}

bool liststack::isempty()
{
	return top == NULL ? true: false;
}

node* liststack::gettop()
{
	return top;
}

ostream& operator <<(ostream& os, liststack&TEST)
{
	node *out = TEST.top;
	while (out)
	{
		os << out->data << endl;
		out = out->link;
	}
	return os;
};
//建立likequeue類封裝兩個鏈式棧liststack,實現佇列的功能
class likequeue
{
public:
	void pushqueue(int);
	bool popqueue();
	bool S1insertS2();
	liststack S1, S2;

};

void likequeue::pushqueue(int test)
{
	S1.push(test);
}

bool likequeue::popqueue()
{
	if (S2.isempty())
	{
		S1insertS2();
	
	}
	S2.pop();
	return true;
}

bool likequeue::S1insertS2()
{
	if (S1.isempty()&&!S2.isempty()) return false;

	node* S1top = S1.gettop();
	while (S1top)
	{
		S2.push(S1top->data);
		S1top = S1top->link;
		S1.pop();
	}
	return true;
}


void main()
{
	likequeue testqueue;
	testqueue.pushqueue(1);//壓入1
	testqueue.pushqueue(2);//壓入2
	testqueue.popqueue();//彈出1	
	//第一次輸出佇列
	liststack* test = &testqueue.S2;//-------------------------更改1處		
	operator<<(cout, *test);
	system("pause");
}