栈和队的应用
2016-05-24 11:39
281 查看
一.实验目的
熟悉掌握数据结构中栈的基本操作,能够使用栈的结构解决一些实际中常见的问题。
二.实验题目
1.解决问题时,对数值的操作可以是二、十、八以及十六,四种数制,利用栈的特性设计程序自动实现数制之间的转化。
2. 在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。设计一个程序可以判断给定的一个文字是否是回文。
说明:
(1)需要注意的是,在程序中要能实现带小数部分的数值的转化。尤其需要注意的是对十六进制的转化,在实际中分别用A、B、C、D、E、F来表示10、11、12、13、14、15。在实际输出的时候要注意这一现象。具体实现中,将待转化的数按照数制取模,将余数放入栈中,而将商作为下一次取模的操作数,重复上述过程,直到最后的商为0。而对于有小数部分的数进行转化时一定要注意,将整数部分和小数部分分开处理,小数部分的转化与前述过程类似,不同之处在于,每次都是乘以待转数制,然后取整数部分放入栈中,重复这一过程。
(2)考虑到栈的先进后出以及队列的后进先出,可以结合这两种结构来实现需要的功能,即将文字分别入队和入栈,然后依次输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。
//小数进制之间的转化有点问题
熟悉掌握数据结构中栈的基本操作,能够使用栈的结构解决一些实际中常见的问题。
二.实验题目
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; }
相关文章推荐
- Set判断重复,TreeSet排序
- 使用不完全填满数组的实现的循环FIFO(队列)
- ceph存储 基于pglog的一致性协议
- [几何]判断两个线段是否相交(多语言实现)
- 动态语言和静态语言两者的区别
- python爬虫抓手机号+java客户端小程序3
- 2016年最好的15个Web设计和开发工具
- Web应用中的路径问题
- Java如何实现系统监控、系统信息收集(转
- Android学习初步
- 实现一个TODO宏
- 用devstack快速部署 openstack
- LeetCode:Combinations
- ceph存储 ceph中pglog处理流程
- mybatis学习笔记(七)增删改查
- [leetcode] 350. Intersection of Two Arrays II
- Activity和Service的生命周期(图)
- cygwin 安装以及配置
- 欢迎使用CSDN-markdown编辑器
- 汉字转全拼