链栈和顺序栈的代码实现

以下代码没有使用模板类(只以int为例)

且没有使用c++的类的思想,仅以结构体

1.顺序栈

#include<iostream>
#define Maximun 1000	//预设栈的大小 
using namespace std;
struct my_stack
{
	int *top;
	int *base;
};

bool creat_stack(my_stack & sta)
{
	sta.base=new int[Maximun];
	if(sta.base == NULL)return false; 
	sta.top=sta.base;	//初始化栈为空 
	return true;
}

void init_stack(my_stack & sta)
{
	int n;
	cout<<"请输入要入栈的数据个数:"<<endl;
	cin>>n;
	cout<<"请输依次输入"<<n<<"个的值:"<<endl;
	while(n--)
	{
		int m;
		cin>>m; 
		*sta.top=m;
		sta.top++;
	}
}

bool stack_push(my_stack & sta)
{
	if(sta.top-sta.base >=Maximun)return false;
	cout<<"请输入要入栈的数:"<<endl;
	int m;
	cin>>m; 
	*sta.top=m;
	sta.top++;
	return true;
} 

bool stack_pop(my_stack & sta)
{
	if(sta.top==sta.base)return false;
	sta.top--;
	return true;
} 

int stack_top(my_stack & sta)
{
	if(sta.top==sta.base)
	{
		cout<<"已经到栈底,出栈错误"<<endl;
		exit(0);
	}
	return *(sta.top-1);
} 
int main()
{
	my_stack sta;
	if(!creat_stack(sta))
	{
		cout<<"error"<<endl;
		exit(0);
	}
	init_stack(sta);
	cout<<stack_top(sta)<<endl;
	if(!stack_pop(sta))
	{
		cout<<"已经到栈底"<<endl;
	}
	if(!stack_push(sta))
	{
		cout<<"入栈失败"<<endl; 
	}
	cout<<stack_top(sta)<<endl;
	//依次清空栈内数值 
	while(sta.top!=sta.base)
	{
		stack_pop(sta); 
		sta.top--; 
	}
	return 0;
}

2.链栈

#include<iostream>
using namespace std;
 
struct stack_point		//链栈的节点 
{
	int data;
	stack_point* next;
};
//链栈,top始终指向栈顶,并且栈底存在元素
//而base始终指向栈底,并且栈底为空 
//当base与top相等时表示栈空
//这与顺序栈相反 
struct mystack			 
{						
	stack_point* base;	 
	stack_point* top;	
};

void init_mystack(struct mystack& s)	
{
	s.base=NULL;
	s.top=NULL;
}

void creat_mystack(struct mystack& s)	
{
	int n;
	cout<<"请输入要创建栈的元素个数"<<endl;
	cin>>n;
	cout<<"请输入元素的值"<<endl;
	for(int i=1;i<=n;i++) 
	{
		stack_point* p=new stack_point;
		cin>>p->data;
		if(i==1)p->next=s.base,s.top=p;	//top始终指向栈顶,并且栈底存在元素
		else p->next=s.top,s.top=p;		//base始终指向栈底,并且栈底为空 
	}
}
void mystack_push(struct mystack& s,int value)
{
	stack_point* p=new stack_point;
	p->data=value;
	p->next=s.top;
	s.top=p;
}

bool mystack_pop(struct mystack& s)
{
	if(s.top==s.base)
	{
		cout<<"已经到栈底,无法元素可删除"<<endl;
		return false; 
	}
	stack_point* p=s.top;
	s.top=p->next;
	delete p;
	return true;
}

int mystack_top(struct mystack& s)
{
	if(s.top==s.base)cout<<"已经到栈底,无元素可取"<<endl,exit(0); 
	return s.top->data;	
}



int main()
{
	mystack s;
	init_mystack(s);
	creat_mystack(s);
	cout<<"将100入栈并输出再出栈"<<endl;
	mystack_push(s,100);
	cout<<mystack_top(s)<<endl;
	if(mystack_pop(s))
	{
		cout<<"出栈成功"<<endl;
	}
	cout<<"---------------------"<<endl;
	cout<<"依次出栈并输出"<<endl; 
	while(s.base!=s.top)
	{
		cout<<mystack_top(s)<<endl;
		mystack_pop(s);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44339734/article/details/89043300