数据结构:栈的经典使用场景-进制转换,括号匹配
学习数据结构的过程中刷到两个经典的栈的使用场景,在此分享一下对这两个算法题的理解:
1.进制转换(在此以十进制转十六进制为例,具体场景更换代码中的除数以及取模的数即可)
1.1定义结构体
typedef struct SequenceStack { int * Button; int Top; unsigned int Size; }SeqStack_t;
1.2初始化,入栈,出栈,判空,判满
`
/**
*初始化
*/
SeqStack_t * SeqStack_Creat(unsigned int size){
SeqStack_t * Manager = (SeqStack_t )calloc(1,sizeof(SeqStack_t));
if (NULL == Manager)
{
perror("Calloc memery for Manager is Failed!");
exit(-1);
}
Manager->Button = (DataType_t )calloc(size,sizeof(DataType_t));
if (NULL == Manager->Button)
{
perror("Calloc memery for Button is failed!");
exit(-1);
}
Manager->Top = -1;
Manager->Size = size;
return Manager;
}
/
判满
/
bool Is_Full(SeqStack_t * Manager){
return (Manager->Top + 1 == Manager->Size) ? true : false;
}
/
*判空
*/
bool Is_Empty(SeqStack_t * Manager){
return (-1 == Manager->Top) ? true : false;
}
/**
*压栈
*/
bool SeqStack_Push(SeqStack_t * Manager,DataType_t data){
if (Is_Full(Manager))
{
printf("Current Stack is full!\n");
return false;
}
Manager->Button[++Manager->Top] = data;
return true;
}
/**
*弹栈
*/
DataType_t SeqStack_Pop(SeqStack_t * Manager){
if (Is_Empty(Manager))
{
printf("Current Stack is empty!\n");
return ;
}
DataType_t temp = Manager->Button[Manager->Top--];
return temp;
}
/*十进制转十六进制:
设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。
*/
void Dec2Hex(SeqStack_t * manager, unsigned int num){
do
{
int remainder = num % 16;
char c = (remainder < 10) ? (remainder + '0') : (remainder - 10 + 'A');
SeqStack_Push(manager,c);
num /= 16 ;
} while (num > 0);
while(!Is_Empty(manager)){
printf("%c",SeqStack_Pop(manager));
}
printf("\n");
}
**1.3**测试
int main()
{
SeqStack_t * manager = SeqStack_Creat(100);
Dec2Hex(manager,200);
return 0;
}
`
测试结果图

在这个函数中,我们通过循环取余和除16(需要转换的进制数)操作,将每次除16得到的余数压入栈内,再通过循环弹栈,得到进制转换后的数。充分利用到了栈这一数据结构“先入后出”的特点,与我们通过除法得到余数再倒序排列余数得到进制转换后的数的思路不谋而合。
`
/**
- 通过键盘输入一个包括'('和')'的字符串string,判断字符串是否有效。要求设计算法实现检查字符串是否有效,
- 有效的字符串需满足以下条件:
- 1.左括号必须用相同类型的右括号闭合。
- 2.左括号必须以正确的顺序闭合。
- 3.每个右括号都有一个对应的相同类型的左括号。
*/
bool SeqStack_StringIsValid(SeqStack_t * Manager,const char * str){
char Pstr = str;
while (Pstr)
{
if (Pstr == '(')
{
SeqStack_Push(Manager,'(');
}
if (Pstr == ')')
{
if (Is_Empty(Manager))
{
return false;
}
SeqStack_Pop(Manager);
}
Pstr++;
}
if (!Is_Empty(Manager))
{
return false;
}
return true;
}
`
测试
int main() { SeqStack_t * manager = SeqStack_Creat(100); bool result = SeqStack_StringIsValid(manager,"(()))"); result = true ? printf("合格\n") : printf("不合格\n"); return 0; }
结果图

浙公网安备 33010602011771号