9 栈的应用

案例

数制的转换

将一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数。

#include<iostream>
using namespace std;
typedef int ElemType;
typedef int SElemType;

//定义链栈
typedef struct StackNode{
	ElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;

void InitStack(LinkStack &S){
	//构造一个空栈
	S=NULL;	
}
//入栈
void Push(LinkStack &S,SElemType e){
	//在栈顶插入元素e
	StackNode *p=new StackNode;//生成新结点
	p->data=e;
	p->next=S;
	S=p;
}
//出栈
void Pop(LinkStack &S,SElemType &e){
	//删除S的栈顶元素 用e返回其值
	if(S==NULL)
		perror("栈空");
	e=S->data;
	StackNode *p=S;  //用p临时保存栈顶元素空间 以备释放
	S=S->next;  //修改栈顶指针
	delete p; //释放原来
}
//判断栈是否为空
bool StackEmpty(LinkStack S){
	if(S!=NULL){
		return false;
	}else{
		return true;
	}
}

//数制的转换
void conversion(int N){
	StackNode *S;
	int e;
	//对于任意一个非负十进制数,打印输出与其等值的八进制数
	InitStack(S);
	while(N){
		Push(S,N%8);  //把N与8求余得到的八进制数压入栈S
		N=N/8;
	}
	while(!StackEmpty(S)){
		Pop(S,e);
		cout<<e;
	}
	
}
int main(){
	int num;
	scanf("%d",&num);
	conversion(num);
	return 0;
}
括号匹配的检验

这里主要考虑[]和()的匹配。

#include<iostream>
using namespace std;
typedef int ElemType;
typedef char SElemType;

typedef struct StackNode{
	ElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;

void InitStack(LinkStack &S){
	S=NULL;
}
//入栈
void Push(LinkStack &S,SElemType e){
	//在栈顶插入元素e
	StackNode *p=new StackNode;//生成新结点
	p->data=e;
	p->next=S;
	S=p;
}
//出栈
void Pop(LinkStack &S,SElemType &e){
	//删除S的栈顶元素 用e返回其值
	if(S==NULL)
		perror("栈空");
	e=S->data;
	StackNode *p=S;  //用p临时保存栈顶元素空间 以备释放
	S=S->next;  //修改栈顶指针
	delete p; //释放原来
}
//判断栈是否为空
bool StackEmpty(LinkStack S){
	if(S!=NULL){
		return false;
	}else{
		return true;
	}
}
// 获取栈顶元素
SElemType GetTop(LinkStack S){
	if(S!=NULL){
		return S->data;  //返回栈顶元素的值,栈顶指针不变
	}else{
		return -1;
	}
}
bool matching(){
	//表达式以"#"结束
	StackNode *S;
	InitStack(S);  //初始化空栈
	int flag=1; //标记匹配结果以控制循环及返回结果
	char x,ch;
	cin>>ch;   //输入第一个字符
	while(ch!='#'&&flag){
		cout<<ch;
		switch(ch){
			case '[':
				Push(S,ch);
				break;
			case '(':
				Push(S,ch);
				break;
			case ')':
				if(!StackEmpty(S)&&GetTop(S)=='(')
					Pop(S,x);
				else
					flag=0;
				break;
			case ']':
				if(!StackEmpty(S)&&GetTop(S)=='[')
					Pop(S,x);
				else
					flag=0;
				break;
		}
		cin>>ch;  //继续读入下一个字符
	}
	if(StackEmpty(S)&&flag)
		return true;
	else
		return false;
}
int main(){
	bool ans=m\atching();
	if(ans){
		printf("success");
	}else{
		printf("false");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xuhuimingc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值