C++实现栈的顺序存储与链式存储

        栈是一种特殊的数据结构,栈中数据先进后出,且栈中数据只能从头部出栈,能直接访问的数据也仅为栈的头部数据,要想访问下面的数据则需要将前面的数据逐个出栈后才可访问。下面通过一个word撤销的案例来解释:

 

         我们用word写paper时,首先需要创建一个空白文档(即一个空栈),然后对这个空白文档进行一系列操作每个操作都是一个新的version,即数据存储压栈的操作。但是paper写完后(version4),我们发现写的paper有问题需要修改,想要回到version1,这就用到了撤销的操作。但是因为word只能直接访问最近的version,我们没法直接回到version1,需要先回到version3再回到version2最后才能回到version1,这种访问方式即出栈访问top。

        栈的基本理论就介绍到这,下面附上栈的两种存储结构的实现代码。

1、栈的顺序存储

#include <iostream>
using namespace std;
const int max_size=1024;
//创建栈
class seqstack
{
public:
	void* data[max_size];  //可以指向任何类型数据的指针
	int size;
};
//初始化栈
seqstack* init_seqstack()
{
	seqstack* stack =new seqstack;
	for (int i = 0; i < max_size; i++)
	{
		stack->data[i]=NULL;
	}
	stack->size=0;
	return stack;
}
//入栈操作
void push_seqstack(seqstack* stack,void* data)
{
	if (stack->size==max_size)
	{
		cout<<"数据已满"<<endl;
		return;
	}
	stack->data[stack->size]=data;
	stack->size++;
}
//返回栈顶元素
void* top_seq_stack(seqstack* stack)
{
	return stack->data[stack->size-1];
}
//出栈
void pop_seqstack(seqstack* stack)
{
	stack->data[stack->size-1]=NULL;
	stack->size--;
}
int main()
{
	//创建栈
	seqstack* stack=init_seqstack();
	//创建数据
	int num[9]={1,2,3,4,5,6,7,8,9};
	//数据入栈
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个入栈数据为:"<<num[i]<<endl;
		push_seqstack(stack,&num[i]);
	}
	cout<<endl;
	//逐个出栈并访问
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个出栈数据为:"<<*(int *)(top_seq_stack(stack))<<endl;  //将出栈的地址强转成int*再解指针
		pop_seqstack(stack);
	}
	system("pause");
	return 0;
}

运行结果为:

 2、栈的链式存储

#include <iostream>
#include <string>
using namespace std;
//节点
class linknode
{
public:
	linknode* next;
};
//自定义数据
class my_data
{
public:
	linknode* node;
	char data;
};
//链式栈
class linkstack
{
public:
	linknode head;
	int size;
};
//初始化栈
linkstack* init_linkstack()
{
	linkstack* stack=new linkstack;
	stack->head.next=NULL;
	stack->size=0;
	return stack;
}
//入栈
void push_linkstack(linkstack* stack,linknode* data)
{
	data->next=stack->head.next;
	stack->head.next=data;
	stack->size++;
}
//出栈
void pop_linkstack(linkstack* stack)
{
	stack->head.next=stack->head.next->next;
	stack->size--;
}
//返回栈顶元素
linknode* top_linkstack(linkstack* stack)
{
	return stack->head.next;
}

int main()
{
	//创建空栈
	linkstack* stack=init_linkstack();
	//创建数据
	string str="ABCDEFGHI";
	my_data data[9];
	for (int i = 0; i < str.size(); i++)
	{
		data[i].data=str[i];
		data[i].node=NULL;
	}
	//入栈
	for (int i = 0; i < str.size(); i++)
	{
		cout<<"第"<<i+1<<"个元素入栈:"<<str[i]<<endl;
		push_linkstack(stack,(linknode*)&data[i]);
	}
	cout<<endl;
	//出栈
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个元素出栈:"<<(((my_data*)top_linkstack(stack))->data)<<endl;
		pop_linkstack(stack);
	}
	system("pause");
	return 0;
}

运行结果为:

 如有错误的地方欢迎指正交流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值