• 数据结构之顺序栈实现进制转换


    栈的应用

    进制转换

    • 1.需要用到前面博文顺序栈基本操作

    示例:

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    #define STACK_INT_SIZE 10 //存储空间初始分配量
    #define STACK_INTCREMENT 2 //存储空间分配增量
    #define N 16   //定义待转换的进制N
    
    typedef int SElemType;
    
    struct SqStack {
    	SElemType *base; //在构造之前和销毁后,base的值为NULL
    	SElemType *top;  //栈顶指针
    	int stacksize;   //当前已分配的存储空间,以元素为单位
    }; //顺序栈
    
    //顺序栈的基本操作
    void InitStack(SqStack &S)
    {
    	//构造一个空栈
    	if (!(S.base = (SElemType*)malloc(STACK_INT_SIZE * sizeof(SElemType)))) {
    		return;
    	}
    
    	S.top = S.base;
    	S.stacksize = STACK_INT_SIZE;
    }
    
    
    void DestoryStack(SqStack &S)
    {
    	//销毁S
    	free(S.base);
    	S.base = NULL;
    	S.top = NULL;
    	S.stacksize = 0;
    }
    
    void ClearStack(SqStack &S)
    {
    	//把S置为空栈
    	S.top = S.base;
    }
    
    int StackEmpty(SqStack S)
    {
    	if (S.top == S.base)
    	{
    		return 1;
    	}
    	else {
    		return 0;
    	}
    }
    
    int StackLength(SqStack S)
    {
    	//返回S的元素个数,栈的长度
    	return S.top - S.base;
    }
    
    
    int GetTop(SqStack S, SElemType &e)
    {
    	//如果栈不空,则用e返回S的栈顶元素,返回值为1
    	//否则返回值为0
    	if (S.top > S.base)
    	{
    		e = *(S.top - 1);
    		return 1;
    	}
    	else {
    		return 0;
    	}
    
    }
    
    
    void Push(SqStack &S, SElemType e)
    {
    	//插入元素e为新的栈顶元素
    	if (S.top - S.base >= S.stacksize) //栈满,分配空间
    	{
    		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACK_INTCREMENT) * sizeof(SElemType));
    		if (!S.base)
    			return;
    		S.top = S.base + S.stacksize;
    		S.stacksize += STACK_INTCREMENT;
    	}
    	*(S.top)++ = e;
    }
    
    int Pop(SqStack &S, SElemType &e)
    {
    	//若栈不空,删除栈S的栈顶元素,用e返回,返回值1
    	//若栈空,返回0
    	if (S.top == S.base)
    		return 0;
    	e = *--S.top;
    	return 1;
    }
    
    void StackTraverse(SqStack S, void(*visit)(SElemType))
    {
    	//从栈底到栈顶依次对栈中的每个元素调用visit()
    	while (S.top > S.base)
    	{
    		visit(*S.base++);
    	}
    	printf("
    ");
    }
    
    void print(SElemType e)
    {
    	printf("%d
    ", e);
    }
    
    
    void Conversion(void) {
    	SqStack s;
    	unsigned int n;
    	SElemType e;
    	InitStack(s); // 初始化栈
    	printf("将十进制整数n转换为%d进制数,请输入:n(>=0)=", N);
    	scanf_s("%u", &n); // 输入非负十进制整数n
    	while (n)
    	{
    		Push(s, n%N); // 入栈n除以N的余数(N进制的低位)
    		n = n / N;
    	}
    
    	while (!StackEmpty(s))  //当栈不空
    	{
    		Pop(s,e);  // 弹出栈顶元素且赋值给e
    		
    #if 1  //16进制转换
    		if (e <= 9) {
    			printf("%d", e); //输出e
    		}
    		else
    		{
    			printf("%c", e+55); //// 大于9的余数,输出相应的字符
    		}
    #endif
    		
    	}
    
    	printf("
    ");
    }
    
    int main(void)
    {
    	Conversion();
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    SQL盲注工具BBQSQL
    嗅探X-Windows服务按键工具xspy
    多协议底层攻击工具Yesinia
    LLMNR欺骗工具Responder
    Arduino可穿戴教程保存源文件与打开已经存在的源文件
    GRDB使用SQLite的WAL模式
    CString之GetBuffer与ReleaseBuffer
    VC++ 模块与资源分离
    KV6.60 SP1
    Html之head部分详解
  • 原文地址:https://www.cnblogs.com/xuelanga000/p/13584397.html
Copyright © 2020-2023  润新知