继续数据库的学习,今天的主题是栈,但是今天我想换一种新的方式,用一道题,用实际操作来熟悉栈。
请听题:使用栈,实现10进制到8进制的转换。
例如:(1348)10 = (2054)8
首先解决的问题是如何实现进制转换。现取一整数n,每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。来张图会看的清楚点,大家应该都非常熟悉啦,我这些有点废话啦。
那剩下的就是今天的主线问题啦,栈。栈也是线性表的一种,不过它是受到限制的线性表,只允许在表尾进行插入和删除操作。允许插入和删除的一段是栈顶,另一端是栈底。如果栈中不包含任何元素,那么这个栈就是空栈。栈中元素的一大特性就是“先进后出”,送你道题,帮助你理解什么是先进后出。
一个栈的输入序列为1,2,3,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么?
答: 可以通过穷举所有可能性来求解:
① 1入1出, 2入2出,3入3出, 即123;
② 1入1出, 2、3入,3、2出, 即132;
③ 1、2入,2出, 3入3出, 即231;
④ 1、2入,2、1出,3入3出, 即213;
⑤ 1、2、3入,3、2、1出, 即321;
合计有5种可能性。
怎么样是不是很简单啊!这些都懂了,那来看看代码吧。
结构定义
typedef struct Node
{
int data;
struct Node * next;
}NODE,*PNODE;
typedef struct Stack
{
PNODE top;//栈顶
PNODE base;//栈底
}STACK,*PSTACK;
初始化栈
void Init(PSTACK PS)
{
PS->top=(PNODE)malloc(sizeof(NODE));//分配存储空间
if(PS->top==NULL)
{
printf("存储分配失败!");
exit(-1);
}
PS->base=PS->top;
PS->top->next =NULL;
}
入栈
假设元素值为x的新结点是p
第一步把top的指针给p
第二步让top指向p
void Push(PSTACK PS,int val)
{
PNODE Pnew=(PNODE)malloc(sizeof(NODE));
if(Pnew==NULL)
{
printf("存储分配失败!");
exit(-1);
}
Pnew->data=val;
Pnew->next=PS->top;
PS->top=Pnew;
}
出栈
出栈操作跟入栈操作刚好相反
第一步把q的指针交给top
第二步释放q
bool Empty(PSTACK PS)
{
if(PS->top == PS->base)
return true;
return false;
}
bool Pop(PSTACK PS,int *val)
{
if(Empty(PS))
{
printf("栈为空,出栈失败!");
return false;
}
else
{
PNODE P=PS->top;
*val = P->data;
PS->top=P->next;
free(P);
return true;
}
}
输出
输出是需要判断栈是否为空,栈为空的条件是P->top=P->base
void Traverse(PSTACK PS)
{
PNODE P=PS->top;
while(P!=PS->base)
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
}
进制转换的实现
实现部分主要是使用栈存放每次做除法运算得到的余数
{
int n,val;
printf("请输入一个十进制数值:");
scanf("%d",&n);
STACK S;
Init(&S);
while(n!=0)
{
int t=n%8;
Push(&S,t);
n=n/8;
}
while(!Empty(&S))
{
Pop(&S,&val);
printf("%d ",val);
}
return 0;
}
全部代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node * next;
}NODE,*PNODE;
typedef struct Stack
{
PNODE top;
PNODE base;
}STACK,*PSTACK;
void Init(PSTACK PS)
{
PS->top=(PNODE)malloc(sizeof(NODE));
if(PS->top==NULL)
{
printf("存储分配失败!");
exit(-1);
}
PS->base=PS->top;
PS->top->next =NULL;
}
void Push(PSTACK PS,int val)
{
PNODE Pnew=(PNODE)malloc(sizeof(NODE));
if(Pnew==NULL)
{
printf("存储分配失败!");
exit(-1);
}
Pnew->data=val;
Pnew->next=PS->top;
PS->top=Pnew;
}
void Traverse(PSTACK PS)
{
PNODE P=PS->top;
while(P!=PS->base)
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
}
bool Empty(PSTACK PS)
{
if(PS->top == PS->base)
return true;
return false;
}
bool Pop(PSTACK PS,int *val)
{
if(Empty(PS))
{
printf("栈为空,出栈失败!");
return false;
}
else
{
PNODE P=PS->top;
*val = P->data;
PS->top=P->next;
free(P);
return true;
}
}
int main()
{
int n,val;
printf("请输入一个十进制数值:");
scanf("%d",&n);
STACK S;
Init(&S);
while(n!=0)
{
int t=n%8;
Push(&S,t);
n=n/8;
}
while(!Empty(&S))
{
Pop(&S,&val);
printf("%d ",val);
}
return 0;
}
好啦,小伙伴们今天的分享就到这,你们学了吗!有什么问题在微信公众号私信我吧!明天见喽!