指针栈利用指针的运算实现进制转换

    科技2022-08-16  105

    指针栈利用指针运算实现进制转换

    该项目是通过书上的例子启发,普通的栈的定义基本上是一个数组,然后一个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; }

    普通的栈的操作的基础是在数组和链的基础上的,如果改变思维,对一段内存区间进行类似的栈操作,那会大大提升对内存的理解和指针运用的理解!

    本人在校本科生,菜鸟学习中,欢迎大佬指导,欢迎大家点赞关注,以后会陆续发布c语言相关例子还有java等,谢谢关注!

    Processed: 0.016, SQL: 9