栈的C++实现
Posted _Unique_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的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++实现的主要内容,如果未能解决你的问题,请参考以下文章