<数据结构>stack & queue

stack:先进后出

queue:先进先出

c++STL提供的函数:

stack:

empty()

pop() //删除栈首元素,返回void

push()

top() //返回栈首元素

swap(stack s) //交换两个栈元素

size() //元素个数

 

queue:

empty()

pop() //删除front()返回的元素,即队列中最老的元素

push()

front() //返回队列中最老的元素

back() //返回最新元素

size()

swap()

 

使用:

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

int NUM=9; 

template<class T>
struct node{
	T val;
	node *next;
};

template<class T>
class MyStack{

private:
	node<T> *top;
public:
	MyStack(){
		top=NULL;
	};
	~MyStack(){
		node<T> *temp = top;
		while(temp!=NULL){
			cout<<"delete:"<<temp->val<<endl;
			node<T> *t = temp;
			temp =temp->next;
			delete t;
		}
	};
	void push(const T &it){
		node<T> *temp = new node<T>();
		temp->val = it;
		if(top==NULL){	//元素插入到链表首,符合先进后出的思想
			temp->next = NULL;
			top = temp;
		}
		else{
			temp->next = top;
			top = temp;
		}
	};
	void pop(){
		if(top == NULL){
			cerr<<"empty stack."<<endl;
			exit(-1);
		}
		node<T> *temp = top;
		top = temp->next;
		delete temp;
	};
	T gettop()const{
		if(top==NULL){
			cerr<<"empty stack."<<endl;
			exit(-1);
		}
		return top->val;
	};
	int size()const{
		int count=0;
		node<T> *temp = top;
		while(temp!=NULL){
			count ++;
			temp = temp->next;
			
		}
		return count;
	};
	bool empty()const{
		return (top == NULL)?true:false;
	};

	friend ostream& operator << <T>(ostream& os,MyStack<T>& s);		//带模板的友元函数声明

};

template<class T>
ostream& operator <<(ostream& os,MyStack<T> &s){
	node<T> *temp = s.top;
	while(temp!=NULL){
		os<<temp->val<<" ";
		temp = temp->next;
	}
	return os;
};

int main(){

	//	mystack
	cout<<"-----mystack-----"<<endl;
	MyStack<int> ms;
	if(ms.empty()){
		for(int i=0;i<NUM;i++)
			 ms.push(i);
	}
	cout<<ms<<endl;	
	cout<<"size:"<<ms.size()<<endl;
	ms.pop();
	cout<<"top="<<ms.gettop()<<endl;
	


	/*	STL stack
	*	
	*/
	cout<<"\n-----STL stack-------"<<endl;
	stack<int> s,s2;
	
	if(s.empty())
		for(int i =0;i<NUM;i++){
			s.push(i);	//s :0-8
			s2.push(8-i);
		}
	s2.push(9);	//S2 0-9

	//s.pop();	//删除top
	cout<<"s.size:"<<s.size()<<endl;

	while(!s2.empty()){
		cout<<s2.top()<<' ';
		s2.pop();
	}
	cout<<endl;
	//s.emplace(4);
	s.swap(s2);		//交换s与s2

	while(!s2.empty()){
		cout<<s2.top()<<' ';
		s2.pop();
	}
	

	/*	队列queue
	*	先进先出:q.front()返回队列最前端的元素 q.pop()删除对前端元素
	*/
	cout<<"\n------STL queue------"<<endl;
	queue<int> q,q2;
	if(q.empty()){
		for(int i =0;i<NUM;i++){
			q.push(i);	//s :0-8
			//q2.push(8-i);
		}
	}
	cout<<q.size()<<endl;
	cout<<q.front()<<endl;	//队列最前端元素(即最早入队列的元素)
	cout<<q.back()<<endl;	//队列末尾元素(最晚进队列元素)
	//q.pop();
	//q2.push(9);
	//q.swap(q2);		
	cout<<endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值