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


    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
      栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(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();
    }



    源代码下载地址如下



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

  • 相关阅读:
    WAMPP安装后mysql无法启动
    转:xampp-php5.6下安装memcached.exe
    apache配置多域名多站点记录
    抽象类
    this关键字
    static关键字
    super关键字
    Set
    Map
    List
  • 原文地址:https://www.cnblogs.com/new0801/p/6177663.html
Copyright © 2020-2023  润新知