顺序栈(==,+=,~,=,运算符重载)(C++)

发布于:2023-01-04 ⋅ 阅读:(334) ⋅ 点赞:(0)

摘要:今天给大家分享最简单的顺序栈的运算符重载!

        好久不见大家,最近在写项目,没时间分享,这次我们随便分享一点简单的东西,顺序栈的部分运算符重载。

       自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要注意的是,它与拷贝构造函数析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。 

C++运算符重载的相关规定如下:

(1)不能改变运算符的优先级;

(2)不能改变运算符的结合型;

(3)默认参数不能和重载的运算符一起使用;

(4)不能改变运算符的操作数的个数;

(5)不能创建新的运算符,只有已有运算符可以被重载;

(6)运算符作用于C++内部提供的数据类型时,原来含义保持不变。

上代码:

#include<iostream>
using namespace std;
class Stack{

public:
		//创建
	Stack(int n)
	{
		data=new int[n];
		top=-1;
		len=n;	
	}
		//销毁
	~Stack()
	{
		delete [] data;
		top =-1;
	}
	//判空
	int stack_is_empty()
	{
		if(top==-1)
		{
			return 0;
		}
		return 1;
	}
	//判满
	int stack_is_full()
	{
		if(top+1==len)
		{
			return 0;
		}
		return 1;
	}
	//求表长
	int length()
	{
		return top+1; 
	}
	//入栈
	void stack_in(int n)
	{
		if(stack_is_full()==0)
		{
			cout <<"栈满" <<endl;
			return;
		}
		else
		{
			top++;
			data[top]=n;
		}
	}
	//弹栈 
	int stack_out()
	{
		if(stack_is_empty()!=0)
		{
			int m =	data[top];
			top--;
			return m;
		}

		 
	}
	//清空
	void clear() 
	{
		top=-1;
		len =0;
	 } 
	//打印
	void print_st()
	{
		int i;
		for(i=0;i<top+1;i++)
		{
			cout << data[i]<<" ";
		}
		cout<<endl;
	 } 
	int operator==(Stack &obj)
	{
		//判断top下标是否一致 
		if( this->top != obj.top )
		{
			return 0;
		}
		
		//判断内容是否一致 
		int i;
		for(i=0; i<=top; i++)
		{
			if( this->data[i] != obj.data[i])
			{
				return 0;
			}
		}
		
		return 1;
	}
	void operator+=(Stack &obj)
	{
		
		if( (this->top + obj.top) > len-1)//判断空间是否足够 
		{
			cout <<"空间不足" << endl;
		}
		int i;
		for(i=0; i<=obj.top; i++)	//s2的数据放在s1后面,压栈 
		{
			this->stack_in(obj.data[i]);
		}
		
	}
	void operator~() //取反重载 
	{
		int n = this->top;
		
		int *p1 = data;
		int *p2 = data+n;
		
		int i, *temp;
		for(i=0; i<n/2; i++)
		{
			*temp = *p1;
			*p1 = *p2;
			*p2 = *temp;
			
			p1++;
			p2--;
		}
	}
	 void operator=(Stack &obj)  //赋值运算重载 
	 {
	 	while(len--)  //先把目标栈弹出清空 
	 	{
	 		stack_out();	
		}
	 	
	 	int l,m,i=0;
	 	l=obj.len; //获取原栈长度 
	 	while(l--)  //循环提取原栈元素到目标栈 
	 	{
			m =	obj.data[i]; //将目标站弹出 从第一个元素开始弹 
			stack_in(m);  //将弹出数值入到目标栈 
			i++;

		}
	 }
private:
	int *data; 
	int top;
	int len;
};

int main(void)
{
	Stack S1(20);
	int n=0;
	while(n!=6)  //循环入栈 
	{
		S1.stack_in(n);
		n++;
	}
	cout<<"栈S1: ";
	S1.print_st(); //打印栈S1 
	Stack S2(6);
	int m=6;
	while(m!=12)  //循环入栈 
	{
		S2.stack_in(m);
		m++;
	}
	cout<<"栈S2: ";
	S2.print_st(); //打印栈S2
	if(S1==S2)
	{
		cout<<"相等"<<endl; 
	}
	else
	{
		cout<<"不相等"<<endl; 
	}
	S1+=S2;
	cout<<"S1+=S2结果: ";
 	S1.print_st();  //打印 S1+=S2结果 
 	~S1;
 	cout<<" ~S1结果: ";
	S1.print_st(); //打印 ~S1结果 	
	S1=S2;   //把栈S2赋值给栈S1 
	cout<<" 打印 S1=S2结果 : "; 
	S1.print_st();  //打印 S1=S2结果 
	return 0;
}

今天的分享到此结束了,哪里写的不对的希望各位好兄弟指正,有时间给你们分享IO多路复用。


网站公告

今日签到

点亮在社区的每一天
去签到