栈-实现十进制转换十六进制、括号匹配

栈-实现十进制转换十六进制、括号匹配

  • 设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。

  • 通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:

    A. 左括号必须用相同类型的右括号闭合。

    B. 左括号必须以正确的顺序闭合。

    C. 每个右括号都有一个对应的相同类型的左括号。

    image

/*****************************************************
*   file name:sequencelist.c
*   author   :zzlyx1239@126.com
*   date     :2025.3.15
*   brief    :顺序栈的实现
*   note     :none
*
*   Copyright (c) 2025 zzlyx1239@126.com All Right Reserved
*
*******************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>


//宏定义顺序表中的数据类型
typedef  int DataType_t;

//定义一个顺序表结构体,声明顺序表首地址,大小,最后一个数据下标等各项参数
typedef struct SequenceStack
{
    DataType_t    *Bottom;//声明顺序栈首地址
    int            Size;//声明顺序栈大小
    int            Top;//声明顺序栈最后一个元素数组下标
}SeqStack_t;

//创建顺序列表并进行初始化
SeqStack_t* SeqStack_Creat(unsigned int size)
{
    //1.为所有顺序表管理者申请堆内存
    SeqStack_t *Manager=(SeqStack_t*)calloc(1,sizeof(Manager));
    //判断是否申请成功
    if(NULL==Manager)
    {
        perror("calloc for  Manager memory is failed!");
        exit(-1);//异常退出
    }

    //2.为所有元素申请堆内存
    Manager->Bottom=(DataType_t*)calloc(size,sizeof(DataType_t));
    if(NULL==Manager->Bottom)
    {
        perror("calloc for Manager->Bottom is failed!");
        free(Manager);
        exit(-1);//异常退出
    }
    
    //3.对顺序表进行初始化
    Manager->Size=size;
    Manager->Top=-1;

    return Manager;

}

//判断顺序栈是否已经满了
bool SeqStack_IsFull(SeqStack_t *Manager)
{
    return Manager->Size==Manager->Top+1?true:false;
}


//顺序栈进栈
bool SeqStack_Push(SeqStack_t *Manager,DataType_t data)
{
    //判断顺序表是否已经满了
    if(SeqStack_IsFull(Manager))
    {
        printf("Sequence is Full!!!");
        return false;
    }
    //顺序表没满,采用尾插法插入数据
    Manager->Bottom[Manager->Top+1]=data;
    Manager->Top++;
    return true;
}

//判断顺序栈是否为空
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
	return (-1==Manager->Top)?true:false;
}

//出栈
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
	DataType_t temp = 0;  //用于存储出栈元素的值

	//1.判断顺序栈是否为空
	if ( SeqStack_IsEmpty(Manager) )
	{
		printf("SeqStack is Empty!\n");
		return;
	}
	
	//2.由于删除了一个元素,则需要让顺序栈的栈顶元素下标-1
	temp = Manager->Bottom[Manager->Top--];

	return temp;
}


//遍历顺序栈中的元素
void SeqStack_Print(SeqStack_t *Manager)
{
    for(int i=0; i<=Manager->Top;i++)
    {
        printf("Stack Element[%d]=%d\n",i,Manager->Bottom[i]);
    }
}

//用栈实现十进制转换成十六进制
void SeqStack_Dec2Hex(SeqStack_t *Manager,unsigned int data)
{
    int temp;
    do
    {
        temp=data%16;//temp存储data被16取余
        if(temp<=9)//当temp在0~9范围内时
        {
            SeqStack_Push(Manager,temp+'0');
        }
        else//当temp在10~15范围内时
        {
            SeqStack_Push(Manager,temp+'A'-10);
        }
        data /= 16;
    }while(data!=0);
    //2.把顺序栈中的元素依次出栈
	printf("0x");
	while( !SeqStack_IsEmpty(Manager) )
	{	
		printf("%c", SeqStack_Pop(Manager) );
	}
	printf("\n");
}

//用栈实现括号匹配
bool SeqStack_IsStringVaild(SeqStack_t *Manager,const char *Str)
{
	char *Pstr = Str; //备份地址,防止地址丢失

	//1.循环遍历字符串,寻找'(' 
	while( *Pstr )
	{
		//判断当前地址下的字符是否为'(',如果是则入栈
		if (*Pstr == '(')
		{
			SeqStack_Push(Manager,'(');	
		}
		if( *Pstr == ')' )
		{
			//判断空栈
			if(SeqStack_IsEmpty(Manager))
			{
				return false;
			}

			SeqStack_Pop(Manager);
		}

		Pstr++;
	}

	//2.判断栈是否为空
	if(!SeqStack_IsEmpty(Manager))
	{
		return false;		
	}

	return true;
}


int main(){
    
	return 0;
}
posted @ 2025-03-18 11:41  骗人就变小狗  阅读(352)  评论(0)    收藏  举报