一、概念:
栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出(LIFO(Last In First Out)或先进后出(FILO(First In Last Out)线性表。
栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。
栈底(Bottom):是固定端,又称为表头。
空栈:当表中没有元素时称为空栈。
设栈S=(a1,a2,…an),则a1称为栈底元素,an为栈顶元素,如图3-1所示。
栈中元素按a1,a2,…an的次序进栈,退栈的第一个元素应为栈顶元素。即栈的修改是按后进先出的原则进行的。
二、 栈的抽象数据类型定义
ADT Stack{
数据对象:D ={ ai|ai∈ElemSet, i=1,2,…,n,n≥0 }
数据关系:R ={<ai-1, ai>|ai-1,ai∈D, i=2,3,…,n }
基本操作:初始化、进栈、出栈、取栈顶元素等
} ADT Stack
三、代码
Stack.h
#ifndef __CHelloWorld__Stack__
#define __CHelloWorld__Stack__
#include <iostream>
#define MAX 5
class stack
{
//数据成员
float num[MAX]; //存放栈数据的数组
int top; //指示栈顶位置的变量
public:
void init(void); //初始化函数
void push(float x); //入栈函数
float pop(void); //出栈函数
};
#endif /* defined(__CHelloWorld__Stack__) */
Stack.cpp
#include "Stack.h"
void stack::init(void)
{
top = 0;
}
void stack::push(float x)
{
if (top==MAX)
{
std::cout<<"Stack is full !"<<std::endl;
return;
};
num[top]=x;
top++;
}
float stack::pop(void)
{
top--;
if (top<0)
{
std::cout<<"Stack is underflow !"<<std::endl;
return 0;
};
return num[top];
}
main.cpp
#include <iostream>
#include "Stack.h"
using namespace std;
int main(int argc, const char * argv[])
{
//声明变量和对象
int i;
float x;
stack a,b; //声明(创建)栈对象
//以下对栈对象初始化
a.init();
b.init();
//以下利用循环和push()成员函数将2,4,6,8,10依次入a栈对象
for (i=1; i<=MAX; i++)
a.push(2*i);
//以下利用循环和pop()成员函数依次弹出a栈中的数据并显示
for (i=1; i<=MAX; i++)
cout<<a.pop()<<" ";
cout<<endl;
//以下利用循环和push()成员函数将键盘输入的数据依次入b栈
cout<<"Please input five numbers."<<endl;
for (i=1; i<=MAX; i++) {
cin>>x;
b.push(x);
}
//以下利用循环和pop()成员函数依次弹出b栈中的数据并显示
for (i=1; i<=MAX; i++)
cout<<b.pop()<<" ";
// std::cout << "Hello, World!\n";
return 0;
}
演示效果图:
参考书籍:《C/C++常用算法手册》 《数据结构-清华大学严蔚敏》