实现栈和队列的不同方法

39 篇文章 0 订阅

实现栈和队列的不同方法

本博客通过顺序和链式两种方式分别去实现了栈和队列,仅供参考

//main.cpp
#include <iostream>
#include "source.hpp"
#include "arrayOfStack.hpp"
#include "arrayOfQueue.hpp"
#include "linkOfStack.hpp"
#include "LinkOfQueue.hpp"
#include <string>
using namespace std;

int main(){
	while(1){
		string commend;
		showMenu1();
		cout << "@user: ~$";
		cin >> commend;
		if(commend == "uas") {
			ArrayStack<string> *stack = new ArrayStack<string>();//a stack with data string
			while(1) {
				MenuStack();
				string commendOfArrayOfStack;
				cout << "@user: ~$";
				cin >>  commendOfArrayOfStack;
				if( commendOfArrayOfStack == "pu"){
					cout <<  "Please enter the data(string) you want to push!" << endl;
					cout << "@user: ~$";
					string data;
					cin >> data;
					if(stack->push(data)) {
						cout << "Push success!" << endl;
					} else {
						cout << "Push fail!" << endl;
					}
					cout << endl;
				} else if( commendOfArrayOfStack == "po") {
					if(stack->pop()){
						cout << "Pop success!" << endl;
					} else {
						cout << "Pop fail!" << endl;
					}
					cout << endl;
				} else if( commendOfArrayOfStack == "em") {
					if(stack->empty()){
 						cout << "The stack is empty!" << endl;
				 	} else {
				 		cout << "The stack is not empty!" << endl;
					 }
					 cout << endl;
				} else if( commendOfArrayOfStack == "to") {
					if(stack->empty()){
 						cout << "Warning! The stack is empty! You cannot pop anything!" << endl;
				 	} else {
				 		cout << "Top data is: " << stack->top() << endl;
					 }
					 cout << endl;
				} else if( commendOfArrayOfStack == "si") {
					cout << "The stack size is " << stack->size() << endl;
					cout << endl;
				} else if( commendOfArrayOfStack == "di") {
					stack->display();
				} else if( commendOfArrayOfStack == "q") {
					break;
				} else {
					cout <<  "Commend error!" << endl << endl;
				}
			}
		} else if(commend == "uaq") {
			ArrayQueue<string> *queue = new ArrayQueue<string>();//a queue with data string
			while(1){
				MenuQueue();
				string commendArrayOfQueue;
				cout << "@user: ~$";
				cin >> commendArrayOfQueue;
				if(commendArrayOfQueue == "ap") {
					if(queue->full()) {
						cout << " Warning! The queue is fulled!" << endl;
					} else {
						cout << "Please enter the data you want to append!" << endl;
						cout << "@user: ~$";
						string data;
						cin >> data;
						if(queue->append(data)) {
							cout << "Append success!" << endl;
						} else {
							cout << "Append fail!" << endl;
						}
					}
					cout << endl;
				} else if(commendArrayOfQueue == "se") {
					if(queue->empty()) {
						cout << " Warning! The queue is empty!" << endl;
					} else {
						if(queue->serve()) {
							cout << "Serve success!" << endl;
						} else {
							cout << "Serve fail!" << endl;
						}
					}
					cout << endl;
				} else if(commendArrayOfQueue == "em") {
					if(queue->empty()) {
						cout << "The queue is empty!" << endl;
					} else {
						cout << "The queue is not enpty!" << endl;
					}
					cout << endl;
				} else if(commendArrayOfQueue == "re") {
					if(queue->empty()) {
						cout << "Warning! The queue is empty!" << endl;
					} else {
						cout << queue->retrieve() << endl;
					}
					cout << endl;
				} else if(commendArrayOfQueue == "si") {
					cout << "The queue's size is " << queue->size() << endl;
					cout << endl;
				} else if(commendArrayOfQueue == "di") {
					queue->display();
				} else if(commendArrayOfQueue == "q") {
					break;
				} else {
					cout << "Commend error!" << endl;
				}
				
			}
		} else if(commend == "uls") {
			LinkStack<string> *stack = new LinkStack<string>();//a stack with data string
			while(1) {
				MenuStack();
				string commendOfLinkOfStack;
				cout << "@user: ~$";
				cin >>  commendOfLinkOfStack;
				if( commendOfLinkOfStack == "pu"){
					cout <<  "Please enter the data(string) you want to push!" << endl;
					cout << "@user: ~$";
					string data;
					cin >> data;
					if(stack->push(data)) {
						cout << "Push success!" << endl;
					} else {
						cout << "Push fail!" << endl;
					}
					cout << endl;
				} else if(commendOfLinkOfStack == "po") {
					if(stack->pop()){
						cout << "Pop success!" << endl;
					} else {
						cout << "Pop fail!" << endl;
					}
					cout << endl;
				} else if(commendOfLinkOfStack == "em") {
					if(stack->empty()){
 						cout << "The stack is empty!" << endl;
				 	} else {
				 		cout << "The stack is not empty!" << endl;
					 }
					 cout << endl;
				} else if(commendOfLinkOfStack == "to") {
					if(stack->empty()){
 						cout << "Warning! The stack is empty! You cannot pop anything!" << endl;
				 	} else {
				 		cout << "Top data is: " << stack->top() << endl;
					 }
					 cout << endl;
				} else if(commendOfLinkOfStack == "si") {
					cout << "The stack size is " << stack->size() << endl;
					cout << endl;
				} else if(commendOfLinkOfStack == "di") {
					stack->display();
				} else if(commendOfLinkOfStack == "q") {
					break;
				} else {
					cout <<  "Commend error!" << endl << endl;
				}
			}
		} else if(commend == "ulq") {
			LinkQueue<string> *queue = new LinkQueue<string>();//a queue with data string
			while(1){
				MenuQueue();
				string commendLinkOfQueue;
				cout << "@user: ~$";
				cin >> commendLinkOfQueue;
				if(commendLinkOfQueue == "ap") {
					cout << "Please enter the data you want to append!" << endl;
					cout << "@user: ~$";
					string data;
					cin >> data;
					if(queue->append(data)) {
						cout << "Append success!" << endl;
					} else {
						cout << "Append fail!" << endl;
					}
					cout << endl;
				} else if(commendLinkOfQueue == "se") {
					if(queue->empty()) {
						cout << " Warning! The queue is empty!" << endl;
					} else {
						if(queue->serve()) {
							cout << "Serve success!" << endl;
						} else {
							cout << "Serve fail!" << endl;
						}
					}
					cout << endl;
				} else if(commendLinkOfQueue == "em") {
					if(queue->empty()) {
						cout << "The queue is empty!" << endl;
					} else {
						cout << "The queue is not enpty!" << endl;
					}
					cout << endl;
				} else if(commendLinkOfQueue == "re") {
					if(queue->empty()) {
						cout << "Warning! The queue is empty!" << endl;
					} else {
						cout << queue->retrieve() << endl;
					}
					cout << endl;
				} else if(commendLinkOfQueue == "si") {
					cout << "The queue's size is " << queue->size() << endl;
					cout << endl;
				} else if(commendLinkOfQueue == "di") {
					queue->display();
				} else if(commendLinkOfQueue == "q") {
					break;
				} else {
					cout << "Commend error!" << endl;
				}
				
			}
		} else if(commend == "q") {
			break;
		} else {
			cout << "Commend error!" << endl << endl;
		}
	}
	
	
	return 0;
}

//source.hpp
#include <iostream>
using namespace std;
#ifndef SOURCE_HPP_
#define SOURCE_HPP_

#define MAXCOUNT 10

void showMenu1(){
	cout << "Using ArrayOfStack----------uas" << endl;
	cout << "Using LinkOfStack-----------uls" << endl;
	cout << "Using ArrayOfQueue----------uaq" << endl;
	cout << "Using LinkOfQueue-----------ulq" << endl;
	cout << "Exit------------------------q"  << endl;
}

void MenuStack(){
	cout << "Push------------pu" << endl;
	cout << "Pop-------------po" << endl;
	cout << "Empty-----------em" << endl;
	cout << "Top-------------to" << endl;
	cout << "Size------------si" << endl;
	cout << "Display---------di" << endl;
	cout << "Return----------q" << endl;
}

void MenuQueue(){
	cout << "Append----------ap" << endl;
	cout << "Serve-----------se" << endl;
	cout << "Empty-----------em"  << endl;
	cout << "Retrieve--------re" << endl;
	cout << "Size------------si" << endl;
	cout << "Display---------di" << endl;
	cout << "Return----------q" << endl;
}


#endif

//arrayOfStack.hpp
#include <iostream>
using namespace std;
#ifndef ARRAYOFSTACK_HPP_
#define ARRAYOFSTACK_HPP_

#define MAXCOUNT 10

template <class T>
class ArrayStack{
public:	
	ArrayStack();
	~ArrayStack();
	bool push(T a);
	bool pop();
	T top();
	int size();
	bool empty();
	void display();
private:
	int count;
	T type[MAXCOUNT];
};

template <class T>
ArrayStack<T>::ArrayStack() {
	count = 0;
}

template <class T>
ArrayStack<T>::~ArrayStack() {
	;
}

template <class T>
bool ArrayStack<T>::push(T a) {
	if(count >= 10){
		return false;
	} else {
		type[count++] = a;
		return true;
	}
}

template <class T>
bool ArrayStack<T>::pop() {
	if(empty()){
		return false;
	} else {
		count--;
		return true;
	}
}

template <class T>
T ArrayStack<T>::top() {
	return type[count-1];
}

template <class T>
bool ArrayStack<T>::empty() {
	if(count <= 0) {
		return true;
	} 
	return false;
}

template <class T>
void ArrayStack<T>::display() {
	for(int i = 0; i < count; i++) {
		if(i != count-1) {
			cout << type[i] << " -> ";
		} else{
			cout << type[i];
		}
	}
	cout << endl;
}

template <class T>
int ArrayStack<T>::size(){
	return count;
}



#endif
//LinkOfStack.hpp
#include <iostream>
using namespace std;
#ifndef LINKOFSTACK_HPP_
#define LINKOFSTACK_HPP_

#define maxqueue 10

template <class S>
class Node{
public:
	S data;
	Node<S> *next;
	Node();
	Node(S _data, Node *_next);
};

template <class S>
Node<S>::Node(){
	data = 0;
	next = NULL;
}

template <class S>
Node<S>::Node(S _data, Node *_next) {
	data = _data;
	next = _next;
}


//---------------------------------------------------
//class stack
template <class T>
class LinkStack{
public:
	LinkStack();
	~LinkStack();
	bool empty();
	bool push(T _data);
	bool pop();
	T top();
	int size();
	void display();
private:
	Node<T> *top_node;
};

template <class T>
LinkStack<T>::LinkStack() {
	top_node = NULL;
}

template <class T>
bool LinkStack<T>::empty(){
	if(top_node == NULL){
		return true;
	}
	return false;
}

template <class T>
bool LinkStack<T>::push(T _data) {
	Node<T> *newNode = new Node<T>(_data, top_node);
	if(newNode == NULL){
		return false;
	}
	top_node = newNode;
	return true;
}

template <class T>
bool LinkStack<T>::pop() {
	Node<T> *old_top = top_node;
	if(top_node == NULL){
		return false;
	}
	top_node = old_top->next;
	delete old_top;
	return true;
}

template <class T>
T LinkStack<T>::top() {
	if(top_node == NULL){
		return 0;
	}
	return top_node->data;
}

template <class T>
LinkStack<T>::~LinkStack(){
	while(!empty()){
		pop();
	}
}

template <class T>
int LinkStack<T>::size() {
	int size = 0;
	Node<T> *temp_node = top_node; 
	while(temp_node) {
		size++;
		temp_node = temp_node->next;
	}
	return size;
}

template <class T>
void LinkStack<T>::display() {
	if(empty()) {
		cout << "This queue is empty!" << endl;
	} else {
		Node<T> *temp_node = top_node;
		int count = 0;
		while(temp_node) {
			if(count != size()-1) {
				cout << temp_node->data << " -> ";
				temp_node = temp_node->next;
				count++;
			} else {
				cout << temp_node->data;
				temp_node = temp_node->next;
			}
			
		}
		cout << endl;
	}
	cout << endl;
}


#endif

//arrayOfQueue.hpp
#include <iostream>
using namespace std;
#ifndef ARRAYOFQUEUE_HPP_
#define ARRAYOFQUEUE_HPP_

#define maxqueue 10

template <class T>
class ArrayQueue{
public:
	ArrayQueue();
	bool empty();
	bool full();
	bool serve();
	bool append(T _data);
	T retrieve();
	int size();
	void display();
private:
	int count;
	int front, rear;
	T data[maxqueue];
};

template <class T>
ArrayQueue<T>::ArrayQueue() {
	count = 0;
	front = 0;
	rear = maxqueue-1;
}

template <class T>
bool ArrayQueue<T>::empty() {
	if(count == 0){
		return true;
	}
	return false;
}

template <class T>
bool ArrayQueue<T>::full() {
	if(count == maxqueue) {
		return true;
	} 
	return false;
}

template <class T>
bool ArrayQueue<T>::serve() {
	if(count <= 0) {
		return false;
	}
	count--;
	front = (front+1)%maxqueue;
	return true;
}

template <class T>
bool ArrayQueue<T>::append(T _data) {
	if(count >= maxqueue){
		return false;
	}
	count++;
	rear = (rear+1)%maxqueue;
	data[rear] = _data;
	return true;
}

template <class T>
T ArrayQueue<T>::retrieve() {
	if(count <= 0){
		return 0;
	}
	return data[front];
}

template <class T>
int ArrayQueue<T>::size() {
	return count;
}

template <class T>
void ArrayQueue<T>::display() {
	if(empty()) {
		cout << "This queue is empty!" << endl;
	} else {
		for(int i = 0; i < size(); i++) {
			if(i != size() - 1)
				cout << data[(front+i)%maxqueue] << " -> ";
			else {
				cout << data[(front+i)%maxqueue];
			}
		}
		cout << endl;
	}
	cout << endl;
}

#endif
//LinkOfQueue.hpp
using namespace std;
#include "linkOfStack.hpp"
#ifndef LINKOFQUEUE_HPP_
#define LINKOFQUEUE_HPP_


template <class T>
class LinkQueue{
public:
	LinkQueue();
	~LinkQueue();
//	LinkQueue(const Queue &original);
	bool empty();
	bool append(T data);
	bool serve();
	T retrieve();
	int size();
	void display();
//	void operator=(const Queue &original);
private:
	Node<T> *front, *rear;
	int count;
};

template <class T>
LinkQueue<T>::LinkQueue(){
	front = rear = NULL;
	count = 0;
}

template <class T>
LinkQueue<T>::~LinkQueue() {
	while(front != rear) {
		Node<T> *temp = front;
		front = front->next;
		delete temp;
	}
	delete front;
}

//template <class T>
//LinkQueue<T>::LinkQueue(const Queue &original);

template <class T>
bool LinkQueue<T>::empty() {
	if(count <= 0) {
		return true;
	}
	return false;
}

template <class T>
bool LinkQueue<T>::append(T data) {
	Node<T> *newNode = new Node<T>(data,NULL);
	if(newNode == NULL) {
		return false;
	}
	if(rear == NULL) {
		front = rear = newNode;
	} else {
		rear->next = newNode;
		rear = newNode;
	}
	count++;
	return true;
}

template <class T>
bool LinkQueue<T>::serve() {
	if(front == NULL) {
		return false;
	}
	Node<T> *oldNode = front;
	front = front->next;
	if(front == NULL) {
		rear = NULL;
	}
	delete oldNode;
	count--;
	return true;
}

template <class T>
T LinkQueue<T>::retrieve() {
	return front->data;
}

template <class T>
int LinkQueue<T>::size() {
	return count;
}

template <class T>
void LinkQueue<T>::display() {
	Node<T> *temp = front;
	for(int i=0;i < count; i++) {
		if(i != count-1) {
			cout << temp->data << " -> ";
		} else {
			cout << temp->data;
		}
		temp = temp->next;
	}
	cout << endl;	
}

#endif

Written by Vilin.

更多技术博客https://vilin.club/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值