链栈的数值转换
链栈的基本操作类似于单链表,栈只能在一端进行插入删除操作。
此处链栈的定义运用到了结构体指针变量的知识,在这里简要说明,以便对链栈定义进一步理解。
结构指针变量
结构指针变量:使用一个指针变量来指向一个结构变量。结构指针变量中的值是指所指向的结构变量的首地址,通过结构指针即可访问该结构变量。这里的 *LinkStack存放结构体StackNode的首地址,有了结构指针变量,就可以更方便的访问该结构体。
结构名和结构变量是两个不同的概念。结构名只能表示一个结构形式,编译系统不对他分配内存空间,只有当某变量被说明为这种类型结构时才对该变量分配存储空间。
其访问的一般形式:(*结构指针变量).成员名 或者 结构指针变量名->成员名。
有了结构指针变量的知识基础我们再来分析该数值转换问题。
问题分析:
进制转换(十转N):用栈暂存低位制
·····N mod d
·····N=N div d
实现代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define OK 1
#define ERROR 0
using namespace std;
//链栈的初始化
typedef struct StackNode{
int data;
struct StackNode *next;
}StackNode, *LinkStack; // LinkStack是头指针,存放首元结点的地址
LinkStack S; //定义头指针的名字是S
void InitStack(LinkStack &S)
{
S=NULL;
}
//判断链栈是否为空
bool StackEmpty(LinkStack S)
{
if(S==NULL)
return OK;
else
return ERROR;
}
//链栈进栈
int Push(LinkStack &S,int e)
{
LinkStack p;
p=new StackNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
//链栈出栈
int Pop(LinkStack &S,int &e)
{
LinkStack p;
if(S==NULL)
return ERROR;
e=S->data;
p=S;
S=S->next;
delete p;
return OK;
}
void conversion()
{
LinkStack S;
int N,e;
InitStack(S);
cout<<"输入一个非负十进制数:"<<endl;
cin>>N;
while(N)
{
Push(S,N%8);
N=N/8;
}
cout<<"与其等值的八进制数是:"<<endl;
while(!StackEmpty(S))
{
Pop(S,e);
cout<<e;
}
}
int main()
{
conversion();
return 0;
}