栈的C++实现

众所周知,栈是一种最常用的数据结构,栈在实现上可以用数组和结构体来实现,下面用结构体来实现栈。考虑到数据类型的通用性,这里使用模板进行编写,便于以后的学习过程中进行使用,不了解模板的同学,可以去网上了解一下C++的模板的使用。这里有一篇关于C++模板类的博客,可以先了解一下:

C++模板详解

好了,下面开始进行代码编写。

首先,当然是引入头文件,这里将stdio.h和iostream都引用了,因为一不小心都用到了。

<span style="font-size:18px;">#include <stdio.h>
#include <iostream>

using namespace std;</span>

引入头文件后,开始声明结构体,因为这里是用结构体实现的。


template <class T>
struct stackNode
{
	T data;
	stackNode * next;
};

T data用来保存数据,然后声明一个结构体的指针,来指向下一个元素。其次,用模板类来声明一个栈:

template <class T>
class myStack
{
public:
	myStack();
	~myStack();
	void push(T data);
	void pop();
	T stackTop();
	bool isEmpty();
private:
	stackNode<T> * top;

};
最开始的当然就是构造函数和析构函数,在构造函数中将top指向NULL,防止访问出错。push用来进行入栈操作,pop进行出站,stackTop用来获取栈顶元素所保存的数据,isEmpty判断栈是否为空。下面开始进行代码的详细编写。当然,首先要写出构造函数和析构函数的代码:


//初始化的时候,一定要将top置空,否则,当遍历到栈底的时候,不为NULL,会继续遍历,造成空指针异常
template <class T>
myStack<T>::myStack(){
	//printf("%d\n",top);
	top = NULL;
	//printf("%d\n",top);
}
//在析构函数中,释放内存,所有的结构,都要进行内存释放,这是必须的
template <class T>
myStack<T>::~myStack(){
	stackNode<T> * node = NULL;
	while (top != NULL)
	{
		node = top;
		top = top->next;
		delete node;
	}
}

这里在初始化的时候要将栈顶指针top置空,否则top会随机产生一个数值,在后来访问的时候,会出现问题;其次是析构函数,将new出来的节点一一释放,防止内存溢出。这里用node指向当前的栈顶指针,然后,将top指向下一个节点,然后将node释放掉。上面的template <class T>在每个方法前面都要写一遍,否则方法无法识别T这种类型。由于使用了模板template,所以,在类和结构体定义的时候都要在后面加上<T>。下面编写其他的方法。

template <class T>
void myStack<T>::push(T data){
	stackNode<T>* node = new stackNode<T>;
	node->data = data;
	node->next = top;
	top = node;
}
template <class T>
void myStack<T>::pop(){
	stackNode<T>* node = top;
	top = top->next;
	delete node;
}
template <class T>
bool myStack<T>::isEmpty(){
	return top == NULL;
}
template <class T>
T myStack<T>::stackTop(){
	return top->data;
}

在push方法中,传入一个模板T类型的变量,然后定义一个stackNode的节点,将node的data属性赋值为传入的data,这样,数据就保存在了节点中,然后,让node的next指针指向已经存在的top结构体,将top赋值为node,这样,就做到了top节点的移动,top就能够永远指向栈顶了。

其次是pop方法。在这里声明一个node,指向top,然后将top指针下移,然后删除node节点,就实现了对栈顶元素的删除。

之后是isEmpty方法,该方法用来判断栈是否为空。最后就是返回栈顶元素了。由于top就是指向栈顶,所以,直接返回top的data属性就行了,好了,到这里,就实现了一个栈。下面对栈进行操作。


int main(){
	myStack<int>* s = new myStack<int>;
	for (int i = 0 ;i < 10; i++)
	{
		s->push(i);
		printf("%d\n",i);
	}
	printf("\n");
	while (!s->isEmpty())
	{
		int i = s->stackTop();
		printf("%d\n",i);
		s->pop();
	}

	system("pause");
	return 0;
}

定义一个栈类型的变量。这里为了方便起见,其实只用了int类型的变量,实际上,可以使用很多其他类型,所以说,在这里还是使用模板会方便很多,通用性强。用for循环的方式将数据存入栈中,然后,再用while循环取出栈中元素,当栈不为空的时候,就进行出栈操作,这里要注意,如果在构造函数中不将top指向NULL的话,在这里用while循环会报错。最后,为了能够看到打印的内容,使用system("pause");方法,防止窗口在打印出结果后直接关闭掉。

将上面写的代码直接复制到一个文件中,就能直接运行了。如果有什么说的不严谨的地方,还希望大家指正。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值