VC++2012编程演练数据结构《3》堆栈实现进制转换

来源:互联网 发布:php 网络爬虫抓取图片 编辑:程序博客网 时间:2024/06/06 03:55
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
  栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(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 10class SqStack{private:SElemType *base;SElemType *top;int stacksize;public://构造一个空栈SStatus InitStack(SqStack  **S);//栈存在则栈被销毁Status DestroyStack();//栈存在则清为空栈Status ClearStack();//栈存在则返回true,否则falsebool 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();}



源代码下载地址如下



http://download.csdn.net/detail/yincheng01/4785289