栈的C++实现

Posted _Unique_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的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");方法,防止窗口在打印出结果后直接关闭掉。

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

以上是关于栈的C++实现的主要内容,如果未能解决你的问题,请参考以下文章

C++栈的应用:逆波兰式的实现

c++栈的使用方法有哪些?

数据结构实验二 栈的应用——迷宫求解问题(c++版本)

用一个栈实现另一个栈的排序

使用 C++ 在 Linux 中将文件移动到垃圾箱

c++实验4 栈及栈的应用+回文+中后缀表达式