您的位置:首页 > 其它

栈和队的应用

2016-05-24 11:39 281 查看
一.实验目的

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

二.实验题目

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: