头文件: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;
}