栈的实现 - C++
2015-08-05 09:01
483 查看
栈是一个重要的数据结构,其特性简而言之就是“后进先出”,这种特性在计算机中有着广泛的运用。其实程序员无时无刻不在使用者栈,函数的调用是我们间接使用栈的最好的例子,但是栈在实际中的运用远不止这些,比较经典的应用还包括判断平衡符号、实现表达式的求值,在路径探索中保存路径也是栈的经典应用之一。具体问题具体分析,但是只要满足“后进先出”的特性,都可以应用栈这一数据结构。
栈的基本操作包括入栈(push)、出栈(pop)、判空(isEmpty)等,在此给出一个基于C++的栈的实现。其中,将栈封装为一个类MyStack,基本数据成员包括用于存储访问栈中元素的指针data、栈顶元素索引top,以及用于控制栈大小的size和increment;栈的每一种基本操作都对应一个成员函数,除了上述的三个基本操作外,还包括判满(isFull)、取栈顶元素(getTopElement)和打印栈中元素(printStack)。
MyStack.h
MyStack.cpp
test.cpp
初始化栈时,会给栈的初始大小、扩展步长赋初值(如果没有通过构造函数指定,则采用默认值),并根据初始大小创建一个元素数组。宏定义
小贴士
缺省参数的构造函数可以为我们带来很大的便利,但是需要注意的是,在声明缺省参数的构造函数时要给出缺省值,而在定义函数时,是不能给出参数的缺省值的,否则在编译时将提示错误“重定义默认参数”。
栈的基本操作包括入栈(push)、出栈(pop)、判空(isEmpty)等,在此给出一个基于C++的栈的实现。其中,将栈封装为一个类MyStack,基本数据成员包括用于存储访问栈中元素的指针data、栈顶元素索引top,以及用于控制栈大小的size和increment;栈的每一种基本操作都对应一个成员函数,除了上述的三个基本操作外,还包括判满(isFull)、取栈顶元素(getTopElement)和打印栈中元素(printStack)。
MyStack.h
#ifndef _MYSTACK_H_ #define _MYSTACK_H_ #include <stdio.h> #include <stdlib.h> #include <iostream> #include <iomanip> using namespace std; #define INISIZE 2 #define INIINCREMENT 2 #define DYNAMIC typedef int elementType; class MyStack { public: int top; int size; int increment; elementType * data; MyStack(int size = INISIZE, int increment = INIINCREMENT); ~MyStack(); bool pop(elementType & e); bool push(elementType e); bool isEmpty(); bool isFull(); bool getTopElement(elementType & e); void printStack(); //打印栈中所有的元素,主要用于调试 }; #endif
MyStack.cpp
#include "MyStack.h" MyStack::MyStack(int size, int increment) { top = -1; this->size = size; this->increment = increment; data = (elementType *)malloc(sizeof(elementType) * this->size); } MyStack::~MyStack() { if (data) { free(data); } } bool MyStack::pop(elementType & e) { if (isEmpty()) { e = -1; return false; } else { e = data[top]; top --; return true; } } bool MyStack::push(elementType e) { if (isFull()) { #ifdef DYNAMIC size = size + increment; data = (elementType *)realloc(data, sizeof(elementType) * this->size); if (data == NULL) { return false; } top ++; data[top] = e; return true; #else return false; #endif } else { top ++; data[top] = e; return true; } } bool MyStack::isEmpty() { return top == -1; } bool MyStack::isFull() { return top == size - 1; } bool MyStack::getTopElement(elementType &e) { if (isEmpty()) { e = -1; return false; } else { e = data[top]; return true; } } void MyStack::printStack() { int i; cout << "SN\t\telement" << endl; for (i=0;i<=top;i++) { cout << i << "\t\t" << data[i] << endl; } cout << "total elements : " << top+1 << endl; cout << "stack size : " << size << endl; }
test.cpp
#include "MyStack.h" int main() { elementType e; MyStack stack(3,2); stack.printStack(); cout << endl; stack.push(10); stack.push(33); stack.push(7); stack.push(22); stack.push(44); stack.printStack(); cout << endl; stack.pop(e); cout << "e = " << e << endl; stack.printStack(); cout << endl; stack.getTopElement(e); cout << "e = " << e << endl; stack.printStack(); }
初始化栈时,会给栈的初始大小、扩展步长赋初值(如果没有通过构造函数指定,则采用默认值),并根据初始大小创建一个元素数组。宏定义
#define DYNAMIC用于指定栈的大小是否可以扩展,如果可以,则在必要时增加栈的大小,否则栈满后,不能再有新的元素入栈。
小贴士
缺省参数的构造函数可以为我们带来很大的便利,但是需要注意的是,在声明缺省参数的构造函数时要给出缺省值,而在定义函数时,是不能给出参数的缺省值的,否则在编译时将提示错误“重定义默认参数”。
相关文章推荐
- oc语言第八课 内存管理二——ios学习连载13
- C++类的对象和类的指针的区别、指针和引用的区别
- c++线性存储
- VC++中操作XML(MFC、SDK)转
- C语言之文件操作02——输出文本文件中的内容显示在屏幕上
- C语言之文件操作01——打印1000以内的质数到文件
- 用链表实现id,姓名,分数的录入功能和排序功能
- 位置式PID算法的C语言代码
- 静态数组实现循环队列 c语言
- C++学习笔记——继承与派生(二)
- C语言去除字符串空格
- zz:用C语言编写Windows服务程序的五个步骤 分享到: QQ空间 新浪微博
- zz: C++后台服务程序开发模式
- iOS开发分分钟搞定C语言 —— 总结
- C++中max_element和min_element
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分
- C/C++经典算法精华整理(1)-求一个数的二进制类型中1(或0)的个数
- c++第一季测试题
- C/C++语法知识精华整理(1)-左值与右值、变量与常量、 define与const、Printf特点、补码与阶码、位运算等
- C语言:从表尾到到表头逆向创建链表,反转链表