栈的应用实例—数制转换
- 先复习一下数电和组成原理课程中所学过的进制转换问题。
- 常见的进制有十进制(D),八进制(O),十六进制(H),二进制(B)。
- 它们之间的部分转换如下:
- 这里有一个例子
- 转换为八进制的结果为2504,可以看出正好与运算过程的值逆序。因此我们可以将运算过程中得到的八进制数的各位顺序进制,然后按出栈序列打印输出即为所求八进制数。我们这里可以用上次的博客里写的程序来完成。
- 实际代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define STACK_INIT_SIZE 100 //栈的初始化容量
#define STACK_INC_SIZE 10 //栈的分配增量
typedef int elemType;
//栈的数据结构
typedef struct{
elemType* base; //栈底指针
elemType* top; //栈顶指针
int stackSize; //当前已分配的栈总存储空间
}SqStack;
void initStack(SqStack& S); //构造空栈并初始化
void pushStack(SqStack& S,elemType data); //数据元素进栈
void popStack(SqStack& S); //数据元素出栈
void initStack(SqStack& S)
{
S.base=(elemType*)malloc(STACK_INIT_SIZE * sizeof(elemType));
if(!S.base) exit(1);
S.top=S.base;
S.stackSize=STACK_INIT_SIZE;
}
void pushStack(SqStack& S,elemType data)
{
if(S.top-S.base>=S.stackSize) //栈满,扩充容量
{
S.base=(elemType*)realloc(S.base,(S.stackSize+STACK_INC_SIZE) * sizeof(elemType));
if(!S.base) exit(1);
S.top=S.base+S.stackSize; //栈顶改变
S.stackSize+=STACK_INC_SIZE;
}
*S.top=data;
cout<<"进栈:"<<*S.top;
S.top++;
cout<<endl;
}
void popStack(SqStack& S)
{
if(S.top!=S.base)
{
cout<<"出栈:"<<*(S.top-1);
S.top--;
}
cout<<endl;
}
void printStack(SqStack& S)
{
cout<<"栈中的内容为:";
for(elemType* i=S.base;i<S.top;i++)
{
int j=0;
cout<<*(i+j)<<" ";
j++;
}
cout<<endl;
}
int main()
{
SqStack S; //定义栈S
initStack(S); //初始化栈S
int N;
cin>>N;
while(N)
{
pushStack(S,N%8);
N=N/8;
}
cout<<endl;
while(S.top>S.base)
{
popStack(S);
if(S.top==S.base)
{
popStack(S);
break;
}
}
return 0;
}
运行结果: