您的位置:首页 > 编程语言 > C语言/C++

栈的实现 - C++

2015-08-05 09:01 483 查看
   栈是一个重要的数据结构,其特性简而言之就是“后进先出”,这种特性在计算机中有着广泛的运用。其实程序员无时无刻不在使用者栈,函数的调用是我们间接使用栈的最好的例子,但是栈在实际中的运用远不止这些,比较经典的应用还包括判断平衡符号、实现表达式的求值,在路径探索中保存路径也是栈的经典应用之一。具体问题具体分析,但是只要满足“后进先出”的特性,都可以应用栈这一数据结构。

   栈的基本操作包括入栈(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
用于指定栈的大小是否可以扩展,如果可以,则在必要时增加栈的大小,否则栈满后,不能再有新的元素入栈。

   小贴士

   缺省参数的构造函数可以为我们带来很大的便利,但是需要注意的是,在声明缺省参数的构造函数时要给出缺省值,而在定义函数时,是不能给出参数的缺省值的,否则在编译时将提示错误“重定义默认参数”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: