C++实现顺序栈和链栈操作(实验4--作业)

顺序栈 

一、主要功能

实现了顺序栈(SqStack)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。

二、数据结构定义

  1. 定义了一些常量:
    • MAXSIZE表示栈的最大长度为 100。
    • OVERFLOw表示存储失败的错误码为 -2。
    • OKERROR分别表示操作成功和失败的状态码。
  2. 定义了数据类型:
    • Statusint类型,用于表示操作的状态。
    • SEleTypeint类型,代表栈中存储的数据类型。
  3. 定义了顺序栈结构体SqStack
    • SEleType *base是指向栈内元素数组的指针。
    • SEleType *top是栈顶指针。
    • int stacksize表示当前分配的栈可使用的最大存储容量。

三、函数功能

  1. StackCreate函数:用于初始化顺序栈,为栈分配内存空间,并设置初始状态。
  2. StackEmpity函数:判断栈是否为空。
  3. StackFull函数:判断栈是否已满。
  4. StackPush函数:将元素入栈,如果栈已满则返回错误状态。
  5. StackPop函数:将栈顶元素出栈,并通过引用参数返回该元素,如果栈为空则返回错误状态。
  6. StackToEmpty函数:将栈置空,通过不断出栈操作实现。
  7. StackDestroy函数:销毁栈,释放内存空间。
  8. StackTop函数:获取栈顶元素。
  9. StackPrint函数:打印栈内所有元素,通过不断出栈并输出实现。

四、主函数流程

  1. 首先创建一个顺序栈S并初始化。
  2. 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素。
  3. 将栈置空。
  4. 进行数制转换功能,用户输入一个数字N和转换的进制数JZ,通过不断对N取余并压入栈中,最后打印转换后的结果。
  5. 销毁栈。
    #include <bits/stdc++.h>
    using namespace std;
    
    #define MAXSIZE 100 //最大长度
    #define OVERFLOw -2
    #define OK 1
    #define ERROR 0
    
    typedef int Status;
    typedef int SEleType;//数据类型
    
    typedef struct {
    	SEleType *base;//栈内元素数组
    	SEleType *top;//栈顶指针
    	int stacksize;  // 当前分配的栈可使用的最大存储容量  
    }SqStack;
    //初始化
    int StackCreate(SqStack &S){
    	S.base = new SEleType[MAXSIZE];
    	if(!S.base) exit(OVERFLOw);//存储失败
    	S.top = S.base;//初始栈里没元素 top = base 
    	S.stacksize = MAXSIZE;
    	return OK;//初始化成功
    }
    //栈的判空
    Status StackEmpity(SqStack &S){
    	if(S.top == S.base) return 1;//空
    	else return 0;//非空
    }
    //栈的判满
    Status StackFull(SqStack &S){
    	if(S.top - S.base == S.stacksize) return 1;//满
    	else return 0;//非满
    }
    //入栈
    Status StackPush(SqStack &S,SEleType e){
    	if(StackFull(S)) return ERROR;
    	*S.top++ = e;//等同于数组赋值后 下标++
    	return OK;
    }
    //出栈
    Status StackPop(SqStack &S,SEleType &e){
    	if(StackEmpity(S)) return ERROR;//栈空
    	//用e接收栈顶元素
    	e = *(--S.top);//top 指向的是栈顶的上方
    	return OK;
    }
    //栈的置空
    Status StackToEmpty(SqStack &S) {
    	SEleType temp;
    	while (!StackEmpity(S)) {
    		StackPop(S, temp);
    	}
    	return OK;
    }
    //栈的销毁
    Status StackDestroy(SqStack &S){
    	delete[] S.base;
    	S.base = NULL;
    	S.top = NULL;
    	S.stacksize = 0;
    	return OK;
    }
    //取栈顶元素
    SEleType StackTop(SqStack &S){
    	return *(S.top-1);
    }
    //打印栈内所有元素
    void StackPrint(SqStack &S){
    	while(!StackEmpity(S)){
    		SEleType e;
    		StackPop(S,e);
    		cout<<e<<" ";
    	}
    }
    int main(){
    	SqStack S ;
    	StackCreate(S);
    	StackPush(S,5);
    	StackPush(S,4);
    	StackPush(S,2);
    	StackPush(S,3);
    	StackPush(S,1);
    	
    	StackPrint(S);
    	
    	StackToEmpty(S);
    	//数制转换
    	int N;cout<<"\n输入要转换的数字: ";
    	cin>>N; 
    	int T = N;
    	int JZ;cout<<"转换为几进制(<10): ";cin>>JZ;
    	while(N){
    		StackPush(S,N%JZ);
    		N/=JZ;
    	}
    	cout<<"10 进制数: "<<T<<"在"<<JZ<<"进制转换后是 "<<endl;
    	StackPrint(S);
    	
    	
    	StackDestroy(S);
    	return 0;
    }

    链栈

一、主要功能

实现了链式栈(LinkStack)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。

二、数据结构定义

  1. 定义了一些常量:
    • MAXSIZE表示栈的最大长度为 100(但在链式栈中未实际用到该常量)。
    • OVERFLOw表示存储失败的错误码为 -2(未实际用到)。
    • OKERROR分别表示操作成功和失败的状态码。
  2. 定义了数据类型:
    • Statusint类型,用于表示操作的状态。
    • LEleTypeint类型,代表栈中存储的数据类型。
  3. 定义了链式栈的节点结构体StackNode
    • LEleType data表示节点存储的数据。
    • struct StackNode *next指向下一个节点的指针。
    • StackNode是节点结构体的名称,*LinkStack是指向节点的指针类型别名,用于表示链式栈。

三、函数功能

  1. StackCreate函数:用于初始化链式栈,将栈顶指针置为NULL
  2. StackEmpty函数:判断链式栈是否为空。
  3. StackPush函数:创建一个新节点,将新节点的数据域设置为给定元素,然后将新节点插入到栈顶(即让新节点的next指向当前栈顶,然后更新栈顶指针为新节点)。
  4. StackPop函数:如果栈不为空,将栈顶元素出栈,通过引用参数返回该元素,并释放栈顶节点的内存空间,更新栈顶指针指向下一个节点。
  5. StackTop函数:获取栈顶元素的值,但不修改栈的状态。
  6. StackToEmpty函数:通过不断出栈操作将链式栈置空。
  7. StackDestroy函数:调用StackToEmpty函数将栈置空后,将栈顶指针置为NULL,实现栈的销毁。
  8. StackPrint函数:通过不断出栈并输出元素的方式打印链式栈中的所有元素,但这个过程会破坏栈的结构。

四、主函数流程

  1. 首先创建一个链式栈S并初始化。
  2. 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素(这会破坏栈的结构)。
  3. 将栈置空。
  4. 进行数制转换功能,用户输入一个数字N和转换的进制数JZ,通过不断对N取余并压入栈中,最后打印转换后的结果(同样会破坏栈的结构)。
  5. 销毁栈。
#include <bits/stdc++.h>
using namespace std;

#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define ERROR 0

typedef int Status;
typedef int LEleType;//数据类型

typedef struct StackNode{ 
	LEleType  data; 
	struct StackNode *next; 
} StackNode,*LinkStack; 
//栈的初始化
Status StackCreate(LinkStack &S){
	S = NULL;
	return OK;
}
//栈的判空
Status StackEmpty(LinkStack &S){
	if(!S) return 1;//空
	else return 0;//非空
}
//入栈
Status StackPush(LinkStack &S,LEleType e){
	StackNode * p = new StackNode; //新节点
	p->data = e; //新节点的数据域
	p->next = S; //新节点压入栈顶
	S = p; //修改栈顶指针为p
	return OK;
}
//出栈
Status StackPop(LinkStack &S,LEleType &e){
	if(StackEmpty(S)) return ERROR;
	e = S->data;
	StackNode * p = S; //新节点
	S = S->next;
	delete p;
	return OK;
}
//获取栈顶元素
LEleType StackTop(LinkStack &S){
	LEleType e = S->data;
	return e;
}
//栈的置空
void StackToEmpty(LinkStack &S){
	while(!StackEmpty(S)){
		LEleType e;
		StackPop(S,e);
	}
}
//栈的销毁
void StackDestroy(LinkStack &S) {
	StackToEmpty(S);
	S = NULL;
}
//打印所有元素(破坏了栈)
void StackPrint(LinkStack &S){
	StackNode * p = S;
	while(!StackEmpty(S)){
		LEleType e;
		StackPop(S,e);
		cout<<e<<" ";
		p = p->next;
	}
}
using namespace std;
int main(){

	LinkStack S;
	StackCreate(S);
	StackPush(S,5);
	StackPush(S,4);
	StackPush(S,2);
	StackPush(S,3);
	StackPush(S,1);
	
	StackPrint(S);
	StackToEmpty(S);
	//数制转换
	int N;cout<<"\n输入要转换的数字: ";
	cin>>N; 
	int T = N;
	int JZ;cout<<"转换为几进制(<10): ";cin>>JZ;
	while(N){
		StackPush(S,N%JZ);
		N/=JZ;
	}
	cout<<"10 进制数: "<<T<<"在"<<JZ<<"进制转换后是 "<<endl;
	StackPrint(S);
		
	StackDestroy(S);
	return 0;
}

运行结果图如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值