栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
以上定义是在经典计算机科学中的解释。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。
打开IDE
我们创建一个VC++2012工程来实现堆栈类与应用
头文件
#if !defined(AFX_STACK_H__CC48020F_CB24_4299_8D43_0DCB84F1375E__INCLUDED_) #define AFX_STACK_H__CC48020F_CB24_4299_8D43_0DCB84F1375E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "stdafx.h" //顺序栈的类定义stack.h #define ERROR 0 #define EQUAL 1 #define OVERFLOW -1 #define STACKSIZE 100 #define STACKINCREMENT 10 class SqStack {private: SElemType *base; SElemType *top; int stacksize; public: //构造一个空栈S Status InitStack(SqStack **S); //栈存在则栈被销毁 Status DestroyStack(); //栈存在则清为空栈 Status ClearStack(); //栈存在则返回true,否则false bool StackEmpty(); // 栈存在则返回栈的元素个数,即栈的长度 int StackLength(); //栈存在且非空则返回栈的栈顶元素 SElemType GetTop(); // 栈存在则插入元素e为新的栈顶元素 Status Push(SElemType e); // 栈存在且非空则删除栈的栈顶元素并用e返回其值 SElemType Pop(SElemType *e); // 栈的遍历 void StackTraverse(void (*visit)(SElemType *)); }; #endif // !defined(AFX_STACK_H__CC48020F_CB24_4299_8D43_0DCB84F1375E__INCLUDED_)
实现文件
////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "stack.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Status SqStack::InitStack(SqStack **S) { (*S)=(SqStack *) malloc(sizeof(SqStack)); (*S)->base=(SElemType *)malloc(STACKSIZE *sizeof(SElemType)); if(!(*S)->base) exit(OVERFLOW); (*S)->top=(*S)->base; (*S)->stacksize=0; return 1; } Status SqStack::DestroyStack() { free(base); return 1; } Status SqStack::ClearStack() { stacksize=0; return 1; } bool SqStack::StackEmpty() { if(stacksize==0) return true; else return false; } int SqStack::StackLength() { return stacksize; } SElemType SqStack::GetTop() { if(top==base) { cerr<<"空栈!\n";exit(1);} return *(top-1); } Status SqStack::Push(SElemType e) { *(top++)=e;stacksize++; return 1; } SElemType SqStack::Pop(SElemType *e) { if(top==base) { cerr<<"空栈!\n"; exit(1); } *e=*--top; stacksize--; return *e; } void SqStack::StackTraverse(void (*visit)(SElemType *)) { while(top!=base) { stacksize--;visit(--top); }}我们来实现调用类演习一下
#include "stdafx.h" #include "stack.h" using namespace std; void conversion() { SqStack *S; SElemType e; int n; S->InitStack(&S); printf("输入十进制数:");cin>>n; if(n<0) { printf("\n数必须大于零!\n"); return;} if(!n) S->Push(0); while(n){ S->Push(n%8);n=n/8;} printf("结果是:"); while(!S->StackEmpty()){ S->Pop(&e); printf("%d",e);} } void main() { printf("运行结果:\n"); conversion(); getch(); }
源代码下载地址如下