顺序栈
一、主要功能
实现了顺序栈(SqStack)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。
二、数据结构定义
- 定义了一些常量:
MAXSIZE
表示栈的最大长度为 100。OVERFLOw
表示存储失败的错误码为 -2。OK
和ERROR
分别表示操作成功和失败的状态码。
- 定义了数据类型:
Status
为int
类型,用于表示操作的状态。SEleType
为int
类型,代表栈中存储的数据类型。
- 定义了顺序栈结构体
SqStack
:SEleType *base
是指向栈内元素数组的指针。SEleType *top
是栈顶指针。int stacksize
表示当前分配的栈可使用的最大存储容量。
三、函数功能
StackCreate
函数:用于初始化顺序栈,为栈分配内存空间,并设置初始状态。StackEmpity
函数:判断栈是否为空。StackFull
函数:判断栈是否已满。StackPush
函数:将元素入栈,如果栈已满则返回错误状态。StackPop
函数:将栈顶元素出栈,并通过引用参数返回该元素,如果栈为空则返回错误状态。StackToEmpty
函数:将栈置空,通过不断出栈操作实现。StackDestroy
函数:销毁栈,释放内存空间。StackTop
函数:获取栈顶元素。StackPrint
函数:打印栈内所有元素,通过不断出栈并输出实现。
四、主函数流程
- 首先创建一个顺序栈
S
并初始化。 - 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素。
- 将栈置空。
- 进行数制转换功能,用户输入一个数字
N
和转换的进制数JZ
,通过不断对N
取余并压入栈中,最后打印转换后的结果。 - 销毁栈。
#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)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。
二、数据结构定义
- 定义了一些常量:
MAXSIZE
表示栈的最大长度为 100(但在链式栈中未实际用到该常量)。OVERFLOw
表示存储失败的错误码为 -2(未实际用到)。OK
和ERROR
分别表示操作成功和失败的状态码。
- 定义了数据类型:
Status
为int
类型,用于表示操作的状态。LEleType
为int
类型,代表栈中存储的数据类型。
- 定义了链式栈的节点结构体
StackNode
:LEleType data
表示节点存储的数据。struct StackNode *next
指向下一个节点的指针。StackNode
是节点结构体的名称,*LinkStack
是指向节点的指针类型别名,用于表示链式栈。
三、函数功能
StackCreate
函数:用于初始化链式栈,将栈顶指针置为NULL
。StackEmpty
函数:判断链式栈是否为空。StackPush
函数:创建一个新节点,将新节点的数据域设置为给定元素,然后将新节点插入到栈顶(即让新节点的next
指向当前栈顶,然后更新栈顶指针为新节点)。StackPop
函数:如果栈不为空,将栈顶元素出栈,通过引用参数返回该元素,并释放栈顶节点的内存空间,更新栈顶指针指向下一个节点。StackTop
函数:获取栈顶元素的值,但不修改栈的状态。StackToEmpty
函数:通过不断出栈操作将链式栈置空。StackDestroy
函数:调用StackToEmpty
函数将栈置空后,将栈顶指针置为NULL
,实现栈的销毁。StackPrint
函数:通过不断出栈并输出元素的方式打印链式栈中的所有元素,但这个过程会破坏栈的结构。
四、主函数流程
- 首先创建一个链式栈
S
并初始化。 - 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素(这会破坏栈的结构)。
- 将栈置空。
- 进行数制转换功能,用户输入一个数字
N
和转换的进制数JZ
,通过不断对N
取余并压入栈中,最后打印转换后的结果(同样会破坏栈的结构)。 - 销毁栈。
#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;
}