栈的应用举例----数制转换

来源:互联网 发布:ubuntu 安装php环境 编辑:程序博客网 时间:2024/05/23 16:54

头文件:SqStack.h

#include<cstdlib>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define STACK_INIT_SISE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef int Status;

typedef struct
{
 SElemType *base;
 SElemType *top;
 int stacksize;
}SqStack;

//构造一个空栈S
Status InitStack(SqStack& S)
{
 S.base = (SElemType*)malloc(STACK_INIT_SISE*sizeof(SElemType));
 if (!S.base)
  exit(OVERFLOW);
 S.top = S.base;
 S.stacksize = STACK_INIT_SISE;
 return OK;
}

//销毁栈S,栈S不再存在
Status DestroyStack(SqStack& S)
{
 S.top = S.base;
 free(S.base);
 S.base = NULL;
 S.top = NULL;
 return OK;
}

//把栈S置空
Status ClearStack(SqStack& S)
{
 S.top = S.base;
 return OK;
}

//若栈S为空栈,则返回TRUE,否则返回FALSE
Status StackEmpty(SqStack S)
{
 if (S.top == S.base)
  return TRUE;
 else
  return FALSE;
}

int StackLength(SqStack S)
{
 return (S.top - S.base);
}

//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status GetTop(SqStack S, SElemType& e)
{
 if (StackEmpty(S))
  return ERROR;
 e = *(S.top - 1);
 return OK;
}

//插入元素e为新的栈顶元素
Status Push(SqStack& S, SElemType e)
{
 if (S.top - S.base >= S.stacksize)
 {
  S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
  if (!S.base)
   exit(OVERFLOW);
  S.top = S.base + S.stacksize;
  S.stacksize += STACKINCREMENT;
 }
 *S.top++ = e;
                         //*S.top = e;
                         //S.top++;
 return OK;
}

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack& S, SElemType& e)
{
 if (StackEmpty(S))
  return ERROR;
 S.top--;
 e = *S.top;
 //e = *--S.top;
 return OK;
}

//访问栈中的数据元素
Status visit(SElemType data)
{
 if (cout << data << "  ")
  return OK;
 else
  return ERROR;
}

//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败,则操作失败
Status StackTraverse(SqStack S, Status(*visit)(SElemType))
{
 SElemType* p = S.base;
 while (S.top>p)
 {
  if (!visit(*p++))
   return ERROR;
 }
 return OK;
}


主函数:

#include"SqStack.h"
void main()
{
 SqStack S;
 InitStack(S);
 SElemType num;
 cout << "输入一个十进制数:";
 cin >> num;
 while (num)
 {
  Push(S, num % 8);
  num /= 8;
 }
 cout << "对应的八进制数为:";
 while (!StackEmpty(S))
 {
  SElemType e;
  Pop(S, e);
  cout << e;
 }
 cout << endl;
}


0 0