栈和队的应用

一.实验目的

熟悉掌握数据结构中栈的基本操作,能够使用栈的结构解决一些实际中常见的问题。

二.实验题目

1.解决问题时,对数值的操作可以是二、十、八以及十六,四种数制,利用栈的特性设计程序自动实现数制之间的转化。

2. 在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。设计一个程序可以判断给定的一个文字是否是回文。

说明:

(1)需要注意的是,在程序中要能实现带小数部分的数值的转化。尤其需要注意的是对十六进制的转化,在实际中分别用A、B、C、D、E、F来表示10、11、12、13、14、15。在实际输出的时候要注意这一现象。具体实现中,将待转化的数按照数制取模,将余数放入栈中,而将商作为下一次取模的操作数,重复上述过程,直到最后的商为0。而对于有小数部分的数进行转化时一定要注意,将整数部分和小数部分分开处理,小数部分的转化与前述过程类似,不同之处在于,每次都是乘以待转数制,然后取整数部分放入栈中,重复这一过程。

(2)考虑到栈的先进后出以及队列的后进先出,可以结合这两种结构来实现需要的功能,即将文字分别入队和入栈,然后依次输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。

//小数进制之间的转化有点问题

#include "iostream"
#include "string.h"
using namespace std;

#define STACK_INIT_SIZE 100
#define STACK_NEW_SIZE 10
typedef struct{
	char* base;
	char* top;
	int stack_size;
}sqstack;


void init_stack(sqstack& my_stack);
bool is_empty(sqstack& my_stack);
void my_push(sqstack& my_stack,char e);
char my_pop(sqstack& my_stack);
void travel_stack(sqstack& my_stack);
void SL_TO_SI();
void SI_TO_SL();
bool is_back();
sqstack my_stack;	



int main(){
	
	sqstack my_stack;
	init_stack(my_stack);
	if(is_empty(my_stack))
		cout<<"The stack is empty"<<endl;
	my_push(my_stack,'A');
	my_push(my_stack,'B');
	my_push(my_stack,'C');
	travel_stack(my_stack);
	cout<<my_pop(my_stack)<<endl;
	travel_stack(my_stack);
	

	//SL_TO_SI();
	SI_TO_SL();
	//is_back();
}



void init_stack(sqstack& my_stack){
	my_stack.base=new char[STACK_INIT_SIZE];
	my_stack.stack_size=STACK_INIT_SIZE;
	my_stack.top=my_stack.base;
}

bool is_empty(sqstack& my_stack){
	if (my_stack.top-my_stack.base==0)
		return true;
	else
		return false;
}

void my_push(sqstack& my_stack,char e){
	if(my_stack.top-my_stack.base>=my_stack.stack_size-1){
		//my_stack.base=(char*)realloc((my_stack.stack_size+STACK_NEW_SIZE)*sizeof(char));
		my_stack.stack_size+=STACK_NEW_SIZE;
		char* old_stack=my_stack.base;
		my_stack.base=new char[my_stack.stack_size+STACK_NEW_SIZE];
		for(int i=0;i<my_stack.top-my_stack.base;i++){
			
			my_stack.base[i]=old_stack[i];
		}
			
	}
	*my_stack.top=e;
	my_stack.top++;
}

char my_pop(sqstack& my_stack){
	if(my_stack.top-my_stack.base==0){
		cout<<"The stack is already empty,cannot pop"<<endl;
		exit(0);
	}
	else{
		my_stack.top--;
		char e=*my_stack.top;
		return e;
	}
	
}

void travel_stack(sqstack& my_stack){
	/*
	这样遍历堆栈同时也破坏了堆栈,因为改掉了堆栈的指针 
	while(my_stack.top-my_stack.base!=0){
		my_stack.top--;
		cout<<*my_stack.top;
	}
	cout<<endl;
	*/
	
	char* top= my_stack.top;
	char* base=my_stack.base;
	while(top-base!=0){
		top--;
		cout<<*top;
	}
	cout<<endl;
	
}
/*
void SL_TO_SI(){
	init_stack(my_stack);//记得初始化 
	cout<<"Input 16 jinzhi number,when input # input end"<<endl;

	char e;
	char ch;
	int number=0;
	int add=0;
	int n=1; 
	cin>>e;
	
	while(e!='#'){
		my_push(my_stack,e);
		cin>>e;
	}
	//travel_stack(my_stack);
	
	while(!is_empty(my_stack)){
		ch=my_pop(my_stack);
		if(ch=='.')
			break;
		if('0'<=ch&&'9'>=ch){
			add=ch-'0';
		}
		
		else if('A'<=ch&&'F'>=ch){
			add=ch-'A'+10;
		}
		else{
			cout<<"The 16 number format error"<<endl;
		}
		
		number=number+add*n;
		n*=16;
	}
	cout<<"The changed 10 jinzhi number is: "<<number<<endl;
	
}
*/

void SL_TO_SI(){
	init_stack(my_stack);//记得初始化 
	cout<<"Input 16 jinzhi number,when input # input end"<<endl;

	char e;
	char ch;
	double number=0;
	double my_float=0;
	int my_int=0;
	int add=0;
	int n=1; 
	double float_n=1.0/16;
	cin>>e;
	
	while(e!='#'){
		my_push(my_stack,e);
		cin>>e;
	}
	//travel_stack(my_stack);
	while(!is_empty(my_stack)){
		ch=my_pop(my_stack);
		if(ch=='.')
			break;
		if('0'<=ch&&'9'>=ch){
			add=ch-'0';
		}
		
		else if('A'<=ch&&'F'>=ch){
			add=ch-'A'+10;
		}
		else{
			cout<<"The 16 number format error"<<endl;
		}
		
		my_float=my_float+add*float_n;
		float_n/=16;
	}
	cout<<"The changed 10 jinzhi number is: "<<my_float<<endl;
	
	
	while(!is_empty(my_stack)){
		ch=my_pop(my_stack);
		if('0'<=ch&&'9'>=ch){
			add=ch-'0';
		}
		
		else if('A'<=ch&&'F'>=ch){
			add=ch-'A'+10;
		}
		else{
			cout<<"The 16 number format error"<<endl;
		}
		
		my_int=my_int+add*n;
		n*=16;
	}
	cout<<"The changed 10 jinzhi number is: "<<my_int<<endl;
	
	travel_stack(my_stack);
	
	
	
}

/*只是整数 
void SI_TO_SL(){
	init_stack(my_stack);//记得初始化 
	int number;
	int add;
	char ch;
	cout<<"Input 10 jinzhi number,when input # input end"<<endl;
	cin>>number;
	while(number){
		add=number%16;
		number/=16;
		if(add>9)
			ch=add-10+'A';
		else
			ch=add+'0';
		my_push(my_stack,ch);
	}
	travel_stack(my_stack);

}
*/
//有问题,关于C++精确度和现实的区别试试0.1 
void SI_TO_SL(){
	init_stack(my_stack);//记得初始化 
	double number=0;
	double my_float=0; 
	int my_int=0;
	int add;
	char ch;
	cout<<"Input 10 jinzhi number,when input # input end"<<endl;
	cin>>number;
	my_int=int(number);
	my_float=number-my_int;
	cout<<my_int<<endl;
	cout<<my_float<<endl;
	
	char* str=new char[100];
	int i=0;
	while(my_float>0.001){
		add=int(my_float*16);
		
		my_float=my_float*16-add;
		cout<<"float"<<my_float<<endl;
		if(add>9)
			ch=add-10+'A';
		else
			ch=add+'0';
		str[i]=ch;
		i++;
	}
	cout<<str<<endl;
	for(int i=strlen(str);i>=0;i--){
		my_push(my_stack,str[i]);
	}
	my_push(my_stack,'.');
	
	if(my_int==0)
		my_push(my_stack,'0');
	while(my_int){
		add=my_int%16;
		my_int/=16;
		if(add>9)
			ch=add-10+'A';
		else
			ch=add+'0';
		my_push(my_stack,ch);
	}
	travel_stack(my_stack);
	
	
	
	
}


//back
bool is_back(){
	init_stack(my_stack);
	char ch;
	char* str=new char[100];
	cout<<"Input number:";	
	cin>>str;
	int n=strlen(str);
	for(int i=0;i<n;i++){
		my_push(my_stack,str[i]);
	}
	//travel_stack(my_stack);
	for(int i=0;i<n;i++){
		ch=my_pop(my_stack);
		if(ch!=str[i]){	
			cout<<str<<"is not back numner"<<endl;
			return false;		
		}
		//逻辑错误 
		//cout<<str<<"is back numner"<<endl;
		//return true;
	
	}
	//修正上面 
	cout<<str<<"is back numner"<<endl;
	return true;
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值