指针栈利用指针运算实现进制转换
该项目是通过书上的例子启发,普通的栈的定义基本上是一个数组,然后一个top元素代表栈顶在数组中的下标,然后对其进行运算。或者是链栈,定义结构体 一个data一个next,通过链的方式链接起来,表头结点设为栈顶,表头指针即为栈顶指针。
但是我设计的栈是一段内存区间,用一段内存区间来作为存储区间,这要对c的指针操作掌握非常熟悉!
定义
typedef struct {
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //当前已经分配的存储空间,以元素为单位
}SqStack;
如果将栈底指针分配空间,那么便可以操作实现利用指针完成操作
头文件的定义如下
#pragma once
#include<stdio.h> //EOF(=^Z或F6),NULL
#include<malloc.h> //malloc()等
#include<limits.h> //INT_MAX等
#include<string.h>
#include<stdlib.h> //atoi()
#include<io.h> //eof
#include<math.h> //floor(),ceil(),abs()*
#include<process.h> //exit()*
/*函数结果状态代码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define INFEASIBLE -1
下面是代码
#include"consts.h"
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct {
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //当前已经分配的存储空间,以元素为单位
}SqStack;
int GetTop(SqStack *S, int *e) {
if (S->top == S->base)return ERROR; //栈空
*e = *(S->top - 1);
return OK;
}
void Push(SqStack *S, int e) {
if (S->top - S->base >= S->stacksize) { //栈满则追加空间
S->base= (int*)realloc(S->base,(STACK_INIT_SIZE+ STACK_INIT_SIZE)* sizeof(int));
if (!S->base)exit(OVERFLOW); //存储分配失败
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++= e;
}
int Pop(SqStack *S, int* e) {
if (S->top == S->base) {
printf("99");
return ERROR; //如果栈空
}
*e = *--S->top;
return 0;
}
int StackEmpty(SqStack *S) {
if (S->top == S->base)return 1; //如果栈空
else return 0;
}
void conversion(SqStack *S) {
int N;
int e;
int p, s;
printf("十进制:");
scanf("%d",&N);
s = N;
while (N) {
p = N % 8;
Push(S,p);
N = N / 8;
}
printf("八进制:");
while (!StackEmpty(S))
{
Pop(S,&e);
printf("%d",e);
}
while (s) {
p = s % 2;
Push(S, p);
s = s / 2;
}
printf("\n二进制:");
while (!StackEmpty(S))
{
Pop(S, &e);
printf("%d", e);
}
}
int main() {
SqStack *S;
S = (SqStack*)malloc(sizeof(SqStack));
S->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));
if (!S->base)exit(OVERFLOW); //存储分配失败
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
conversion(S);
return 0;
}
普通的栈的操作的基础是在数组和链的基础上的,如果改变思维,对一段内存区间进行类似的栈操作,那会大大提升对内存的理解和指针运用的理解!
本人在校大学生,菜鸟学习中,欢迎大佬指导,欢迎大家点赞关注!