C++实现顺序栈的基本操作(十进制数转换任意进制数)

目的:领会顺序栈存储结构和掌握顺序栈中的各种基本运算算法设计。

内容:编写一个程序,实现顺序栈(假设栈中元素类型ElemType为char)的各种基本运算。

栈的特点是先进后出,而转换进制数的过程正好符合栈的特点。

另外一个函数:

1. 函数1:利用栈能将一个十进制整数化为36进制以内的任意进制数(十个数字加26个大写字母作为基数),整数和转化的进制由用户输入。

测试数据: 1234567转化为29进制的数是多少?

=================================================

定义顺序栈的数据结构

#include<iostream>
using namespace std;

#define MaxSize 40
typedef char ElemType;//定义ElemType类型
typedef struct			//定义顺序栈结构体
{
	ElemType data[MaxSize];
	int top;
}SqStack;

初始化顺序栈

void InitSqStack(SqStack *&L)		//初始化顺序栈 
{
	L=new SqStack;
	L->top=-1;
}

判断是否为空栈

bool SqStackEmpty(SqStack *L)			//判断顺序栈是否为空栈 
{
	return(L->top==-1);
}

 进栈

进栈需要判断该顺序栈是否为满栈

bool PushSqStack(SqStack *&L,ElemType e)	//判断元素e是否能进栈,若能则令栈顶指针指向元素e 
{
	if(L->top==MaxSize-1)//满栈条件
		return false;
	else
	{
		L->top++;
		L->data[L->top] = e;
		return true;
	}
}

出栈

出栈需要判断该顺序栈是否为空栈

bool PopSqStack(SqStack*& L, ElemType& e)//判断顺序栈栈顶元素是否存在,若存在则取栈顶元素,并让指针--
{
	if (L->top == -1)//空栈条件
		return false;
	else
	{
		e = L->data[L->top];
		L->top--;
		return true;
	}
}

 十进制数转换任意进制数

void TenConversionN(SqStack *&L,ElemType b[],int N)	//进行10进制数转换为N进制数,并将与结果相反的值依次进栈
{
	ElemType d;						//定义字符变量d 
	int t=0,d1;						//定义整型变量t,d1 
	for(int i3=0;b[i3]!='\0';i3++)			//将用户输入的10进制数转化成整型,并用t保存 
		t=t*10+b[i3]-'0';
	for(int i4=0;;i4++)			//将10进制数依次处理 
	{
		d1=t%N;					//让d1保存10进制数对N的余数 
		if(d1>=0 && d1<=9)			//判断d1是否在0-9的区间 若是则转化为字符0-9 
			d=d1+48;
		else if(d1>9 && d1<36)		//判断d1是否在10-35的区间,若是则转化为字符A-Z 
			d=d1+65-10;
		t/=N;							//重置t为t/N 
		if(L->top==MaxSize-1)			//判断元素e是否能进栈,若能则令栈顶指针指向元素e 
			cout<<"进栈失败!"<<endl;
		else
		{
			L->top++;
			L->data[L->top]=d;
		}
		if(t==0)				//当t为0时跳出循环,避免死循环 
			break;
	}
}

销毁栈

void DestoryStack(SqStack *&L)		//销毁栈 
{
	delete (L);
}

=================================================

主函数

阶段一:依次进栈A、B、C、D、E,并进行空栈的判断,再依次出栈。

阶段二:十进制数的转换

int main()
{
	SqStack *L1;							//定义顺序栈 
	InitSqStack(L1);						//初始化顺序栈 
	
	
	cout<<"将顺序栈初始化后"<<endl;
	if(!SqStackEmpty(L1))					//判断顺序栈是否为空栈并输出结果 
		cout<<"该栈非空"<<endl;
	else
		cout<<"该栈为空"<<endl; 
	
	
	ElemType a[5]={'A','B','C','D','E'};		//定义字符数组a 
	for(int i1=0;i1<5;i1++)					//让数组a中元素依次进栈 
		if(!PushSqStack(L1,a[i1]))			//判断数组a中元素是否进栈成功,若失败则提示 
			cout<<"进栈失败!"<<endl;
			
	
	cout<<"将A,B,C,D,E依次进栈后"<<endl; 
	if(!SqStackEmpty(L1))					//判断顺序栈是否为空栈并输出结果 
		cout<<"该栈非空"<<endl;
	else
		cout<<"该栈为空"<<endl;
		
		
	ElemType c;							//定义字符变量c,利用c取出顺序栈内栈顶元素 
	for(int i2=0;i2<5;i2++)				//依次取出顺序栈内栈顶元素,若顺序栈为空栈提示出栈失败,此时需取出数组a中元素 
		if(!PopSqStack(L1,c))
			cout<<"出栈失败!"<<endl;
		else
			cout<<c<<' ';
	cout<<endl;
		
	
	cout<<"将顺序栈内元素出栈后"<<endl;
	if(!SqStackEmpty(L1))				//判断顺序栈是否为空栈并输出结果 
		cout<<"该栈非空"<<endl;
	else
		cout<<"该栈为空"<<endl;


	ElemType b[MaxSize];					//定义字符数组b保存用户输入的十进制数,字符变量d 
	int n;								//定义整型变量n 
	cin>>b>>n;							//让用户输入十进制数b,以及需要转换成的n进制 
	TenConversionN(L1,b,n);				//利用函数将十进制数转换为n进制数,并将与结果相反的值依次进顺序栈 
	for(int i2=0;L1->data[i2]!='\0';i2++)	//依次取出顺序栈内栈顶元素,若顺序栈为空栈提示出栈失败,此时需取出转化后的n进制数 
		if(!PopSqStack(L1,c))
			cout<<"出栈失败!"<<endl;
		else
			cout<<c;
	cout<<endl;
	
	
	DestoryStack(L1);					//销毁顺序栈 
	cout<<"已将顺序栈销毁"<<endl;
}

猜你喜欢

转载自blog.csdn.net/henry594xiaoli/article/details/124637564