栈的应用

1.栈的定义
struct Stack{
T* data; // 数据元素存储空间的开始地址
int top; // 栈顶元素所处数组位置
int max; // 栈存储空间最多可存储的数据元素个数
};
typedef int T; // 数据元素的数据类型

2.入栈和出栈的操作
Stack_Push(stk,e)//入栈
e=Stack_Pop(stk)//出栈

3.利用栈实现整数的十进制转八进制
利用stack栈实现整数的十进制转八进制,输入参数:十进制整数 e, 打印e的八进制结果,末尾换行
//算法:十进制转八进制就是十位数除8的余数后得先出,符合栈的先进后出的特点,先给栈分配空间,然后用Stack_Push(stk,e%8),最后e=Stack_Pop(stk)

void Decimal_Conversion_Octal(T e)
{Stack* stk=Stack_Create(32);
while(e!=0)
{Stack_Push(stk,e%8);
e=e/8;}
if(!Stack_IsEmpty(stk))
{
e=Stack_Pop(stk);
printf("%d",e);}
printf("\n");
}

4.利用栈判断字符串括号是否匹配
利用stack栈判断括号是否匹配,输入参数:字符串序列,字符串长度,若匹配输出YES,否则输出NO,末尾换行
//算法:用一个while循环和一个switch语句使字符串若是左括号进栈,先确保左括号全部进栈,若是右括号,则用If语句判断是否对应的左括号与出栈的第一个括号相等,若相等,则出栈赋值,循环结束,栈空则输出YES

void Bracket_Match(T* str, int len)
{Stack* stk=Stack_Create(100);
int i=0;
char ch=str[i];
while(str[i]!='\0')
{switch(str[i])
{case'(':case'{':case'[':
Stack_Push(stk,str[i]);break;
case')':if('('==stk->data[stk->top])ch=Stack_Pop(stk);break;
case'}':if('{'==stk->data[stk->top])ch=Stack_Pop(stk);break;
case']':if('['==stk->data[stk->top])ch=Stack_Pop(stk);break;
}
i++;
}
if(Stack_IsEmpty(stk))
{printf("YES");printf("\n");}
else{printf("NO");printf("\n");}
}

5.利用栈判断字符串是否为回文串
利用stack栈判断字符串是否为回文串, 输入参数:字符串序列,字符串长度,若是回文串输出YES,否则输出NO,末尾换行
//算法:用while循环将字符串元素压入栈中,再用while循环和if语句判断出栈的元素(相当于字符串的逆序)是否与字符串的顺序的元素相同,循环结束若栈为空则YES

void Palindrome(T* str, int len)
{
Stack* stk=Stack_Create(300);
int i=0;j=0;
char ch;
while(str[i]!='\0')
{
Stack_Push(stk,str[i]);
i++;
}
while(str[j]='\0')
{if(stk->data[stk->top]==str[j])
{ch=Stack_Pop(stk);j++;}
else break;
}
if(Stack_IsEmpty(stk))
{printf("YES");printf("\n");
}
else {printf("NO");printf("\n");}
}
5.若已知一个栈的入栈顺序是A、B、C、D,其出栈序列为P1、P2、P3、P4,则P2、P4不可能是(D,C)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尾迹双冒号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值