C++实现顺序栈

用C++简单地实现了顺序栈,这种实现方法其实是把一个数组看成是两个栈,左右各一个,这样就可以更加合理的利用数组的空间,尤其是当两个栈的数据类型一样,一个栈增加另一个减小两个栈这样交替时。实现代码如下:

#include<iostream>
#include<cstdio>
#define maxsize 1000
using namespace std;

class stack{
	private:
		int *data=new int[maxsize];
		//int data[maxsize];用delete释放的只能是用new动态分配的数组空间,
		//若数组不是动态分配的则不能用delete释放。否则会停止工作。 
		int probe1;
		int probe2;
	public:
		stack(){
			probe1=-1;
			probe2=maxsize;
		}
		void destorystack();
		void cleanall();
		void pop(int which);
		void push(int which,int num);
		bool isempity(int which);
		int  length(int which);
		int gettop(int which);
};
void stack:: cleanall(){
	probe1=-1;
	probe2=maxsize;
}
void stack:: destorystack(){
     delete []data; 
	
}
void stack:: pop(int which){
	if(which==1){
		if(probe1!=-1)
		probe1-=1;
		else
		cout<<"此栈为空!";
	}
	else if(which==2){
	 	if(probe2!=maxsize)
		probe2+=1;
		else
		cout<<"此栈为空!"; 
	}
	else{
		cout<<"输入1或者2" ;
	} 
}
void stack:: push(int which,int num){
	if(which==1){
		if(probe1+1!=probe2){
		
		probe1++;
		data[probe1]=num;
	}
		else
		cout<<"此栈已满!";
	}
	else if(which==2){
	 	if(probe2-1!=probe1){
	 			probe2--;
	 			data[probe2]=num;
		 } 
	
		else
		cout<<"此栈已满!"; 
	}
	else{
		cout<<"输入1或者2" ;
	} 
}
bool stack:: isempity(int which){
	if(which==1){
		if(probe1==-1)
		return true;
		else
		 return false;
	}
	else if(which==2){
	 	if(probe2==maxsize)
			return true;
		else
	return false;
	}
	else{
		cout<<"输入1或者2" ;
	} 
}
int stack::length(int which){
	if(which==1){
		 return probe1+1;
	}
	else if(which==2){
	 	return maxsize-probe2;
	}
	else{
		cout<<"输入1或者2" ;
	} 
}
int stack::gettop(int which){
	if(which==1){
		 return data[probe1];
	}
	else if(which==2){
	 	return data[probe2];
	}
	else{
		cout<<"输入1或者2" ;
	} 
}
int main(){
	stack test;
	if(test.isempity(1))cout<<"1 is eempity!"<<endl; 
	if(test.isempity(2))cout<<"2 is eempity!"<<endl;
	for(int i=0;i<100;i++){
		test.push(1,i);
		test.push(2,i+1);
	}
	cout<<"1的top为"<<test.gettop(1)<<endl<<"2的top为"<<test.gettop(2)<<endl;
	cout<<"此时1长度为"<<test.length(1)<<"\t此时2长度为"<<test.length(2)<<endl;
	for(int i=0;i<10;i++){
	    test.pop(1);
		test.pop(2);
	}
	cout<<"1的top为"<<test.gettop(1)<<"    "<<"1的top为"<<test.gettop(2)<<endl;
	cout<<"此时1长度为"<<test.length(1)<<"\t此时2长度为"<<test.length(2)<<endl;
    test.destorystack();
	return 0;
}

输出结果为:

1 is eempity!
2 is eempity!
1的top为99
2的top为100
此时1长度为100  此时2长度为100
1的top为89    1的top为90
此时1长度为90   此时2长度为90

在实现的过程中有一些小毛病:

1.总是把else if两个词连在一起来写

2.使用define 时

#define maxsize 1000

没有加分号,相当于给1000取了一个maxsize的别名

3.直接用free或者delete给一个已经声明了大小的数组释放空间是不行的,程序结束会自动释放空间。

也就是delete只能释放由new分配的数组空间

举例:

int a[100];
//这个数组a是不能用delete释放空间的,因为这个数组a在声明时就已经说明了空间的大小,在最后程序会自动释放这个空间。
int *b;
b=new int[100];
//这个要在最后用delete []b; 语句来动态释放,因为数组b是一个动态数组,数组空间是动态分配的,程序是不能自动释放的,所以要自己用delete来释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值