栈的基本操作 和使用栈 进行进制转换
栈的基本操作
顺序存储
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
Status inti(SqStack &s); // 栈的初始化
Status Push(SqStack &s,SElemType e); //入栈
Status DestroyStack(SqStack &s); //销毁栈
Status ClearStack(SqStack &s); //清空栈
Status StackEmpty(SqStack s);//栈是否为空
Status StackLenth(SqStack s);//栈的长度
Status GetTop(SqStack s);//栈顶元素
Status Pop(SqStack &s,SElemType &e);//删除栈顶元素
Status StackTrave(SqStack s);// 访问栈的每个元素
Status StackLenth(SqStack s) {
if(s.top == s.base)
return 0;
else
return s.top-s.base;
}
Status StackEmpty(SqStack s) {
if(s.base == s.top)
return true;
else
return false;
}
Status DestroyStack(SqStack &s) {
s.top = s.base = NULL;
}
Status inti(SqStack &s) {
s.base = new SElemType[MAXSIZE];
if(!s.base)exit(OVERFLOW);
s.top = s.base;
s.stacksize = MAXSIZE;
return OK;
}
Status Push(SqStack &s,SElemType e) {
if(s.top-s.base==s.stacksize) return ERROR;
*s.top++=e;
return OK;
}
Status Pop(SqStack &s) {
if(s.top==s.base)
return ERROR;
int num = *--s.top;
return num;
}
Status StackTrave(SqStack s) {
printf("依次出栈: ");
if(s.top==s.base)
return ERROR;
while(s.top!=s.base) {
printf("%d ",*--s.top);
}
printf("\n");
}
Status GetTop(SqStack s) {
if(s.top==s.base) {
printf("栈为空!\n");
return ERROR;
}
printf("栈顶元素: %d\n",*--s.top);
return OK;
}
Status ClearStack(SqStack &s) {
s.top = s.base;
}
int main() {
SqStack s1,s2,s3;
if(inti(s1))
printf("初始化成功!\n");
int l,num,c;
printf("请输入要输入的个数:");
scanf("%d",&l);
printf("请输入进栈数值: ");
for(int i=0; i<l; i++) {
scanf("%d",&num);
Push(s1,num);
}
printf("haha %d\n",*s1.base);
printf("\n");
GetTop(s1);
printf("\n");
StackTrave(s1);
printf("删除栈顶元素\n");
if(Pop(s1))
printf("删除成功\n");
else
printf("删除失败\n");
printf("\n");
StackTrave(s1);
printf("\n");
printf("判断栈是否为空?\n");
if(StackEmpty(s1))
printf("栈为空\n");
else
printf("栈不为空\n");
printf("栈的长度:%d\n",StackLenth(s1));
printf("\n");
printf("清空栈......\n");
if(ClearStack(s1))
printf("已清空\n");
else
printf("清空失败\n");
printf("\n");
printf("栈的长度:%d\n",StackLenth(s1));
printf("\n");
printf("销毁栈......\n");
DestroyStack(s1);
if(s1.top==NULL)
printf("栈已销毁\n");
else
printf("销毁失败\n");
return 0;
}
链式存储
#include<iostream>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct StackNode {
ElemType date; //ElemType 类型的数据
struct StackNode *next;
} StackNode,*LinkStack;
Status inti(LinkStack &s); // 栈的初始化
Status Push(LinkStack &s,ElemType e); //入栈
Status DestroyStack(LinkStack &s); //销毁栈
Status ClearStack(LinkStack &s); //清空栈
Status StackEmpty(LinkStack s);//栈是否为空
Status StackLenth(LinkStack s);//栈的长度
Status GetTop(LinkStack s);//栈顶元素
Status Pop(LinkStack &s,ElemType &e);//删除栈顶元素
Status StackTrave(LinkStack s);// 访问栈的每个元素
Status inti(LinkStack &s) {
s=NULL;
return OK;
}
Status Push(LinkStack &s,ElemType e) {
LinkStack p;
p = new StackNode;
p->date = e;
p->next=s;
s=p;
return OK;
}
Status StackEmpty(LinkStack s) {
if(s==NULL)
return true;
else
return false;
}
Status ClearStack(LinkStack &s) {
if(s==NULL)
return ERROR;
LinkStack p;
p = s;
while(p) {
s=s->next;
delete p;
p=s;
}
return OK;
}
int StackLenth(LinkStack s) {
int len=0;
if(s==NULL)
return ERROR;
while(s) {
s=s->next;
len++;
}
return len;
}
Status DestroyStack(LinkStack &s) {
if(s==NULL)
return ERROR;
LinkStack p;
p=s;
while(p) {
s=s->next;
delete p;
p=s;
}
delete s;
return OK;
}
Status Pop(LinkStack &s,ElemType &e) {
LinkStack p;
if(s==NULL)
return ERROR;
e=s->date;
p = s;
s=s->next;
delete p;
return OK;
}
Status StackTrave(LinkStack s) {
if(s==NULL)
return ERROR;
printf("依次出栈:");
while(s!=NULL) {
printf("%d ",s->date);
s=s->next;
}
printf("\n");
return OK;
}
Status GetTop(LinkStack s) {
if(s==NULL)
return ERROR;
printf("栈顶元素为:%d\n",s->date);
return OK;
}
int main() {
LinkStack s1,s2;
ElemType e;
int l;
if(inti(s1))
printf("初始化成功!\n");
printf("请输入栈的长度:");
scanf("%d",&l);
printf("请输入入栈数字:");
for(int i=0; i<l; i++) {
scanf("%d",&e);
Push(s1,e);
}
StackTrave(s1);
printf("\n");
GetTop(s1);
printf("\n");
printf("删除栈顶元素\n");
Pop(s1,e);
StackTrave(s1);
printf("栈的长度:");
printf("%d\n",StackLenth(s1));
printf("\n");
printf("判断栈是否为空?\n");
if(StackEmpty(s1))
printf("栈为空\n");
else
printf("栈不为空\n");
printf("\n");
printf("清空栈......\n");
ClearStack(s1);
printf("判断栈是否为空?\n");
if(StackEmpty(s1))
printf("栈为空\n");
else
printf("栈不为空\n");
printf("栈的长度:");
printf("%d\n", StackLenth(s1));
printf("\n");
printf("销毁栈......\n");
DestroyStack(s1);
if(s1==NULL)
printf("销毁成功\n");
return 0;
}
进制转换-顺序存储
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
Status inti(SqStack &s) {
s.base = new SElemType[MAXSIZE];
if(!s.base)exit(OVERFLOW);
s.top = s.base;
s.stacksize = MAXSIZE;
return OK;
}
Status Push(SqStack &s,SElemType e) {
if(s.top-s.base==s.stacksize) return ERROR;
*s.top++=e;
return OK;
}
Status StackTrave(SqStack &s,SElemType x) {
printf(" %d进制为:",x);
if(s.top==s.base)
return ERROR;
while(s.top!=s.base) {
SElemType e = *--s.top;
if(e>=10)
printf("%c",char(e+55));
else
printf("%d",e);
}
printf("\n");
}
int main() {
SElemType num,x;
SqStack q;
int t;
printf("请输入数据组数:");
scanf("%d",&t);
while(t--) {
printf("请输入十进制数:");
scanf("%d",&num);
printf("请输入要转换的进制: ");
scanf("%d",&x);
inti(q);
while(num) {
Push(q,num%x);
num=num/x;
}
StackTrave(q,x);
printf("\n");
}
return 0;
}
进制转换-链式存储
#include<iostream>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct StackNode {
ElemType date;
struct StackNode *next;
} StackNode,*LinkStack;
Status inti(LinkStack &s) {
s=NULL;
return OK;
}
Status Push(LinkStack &s,ElemType e) {
LinkStack p;
p = new StackNode;
p->date = e;
p->next=s;
s=p;
return OK;
}
Status StackTrave(LinkStack &s,ElemType x) {
if(s==NULL)
return ERROR;
printf("%d进制为:",x);
while(s!=NULL) {
ElemType e;
e= s->date;
if(e>=10) {
printf("%c",e+55);
} else
printf("%d",s->date);
s=s->next;
}
printf("\n");
return OK;
}
int main() {
LinkStack q;
ElemType num,x;
int t;
printf("请输入数据组数:");
scanf("%d",&t);
while(t--) {
printf("请输入十进制数:");
scanf("%d",&num);
printf("请输入要转换的进制: ");
scanf("%d",&x);
inti(q);
while(num) {
Push(q,num%x);
num=num/x;
}
StackTrave(q,x);
printf("\n");
}
}
本文详细介绍了栈的基本操作,包括初始化、入栈、出栈等,并通过实例演示了如何利用栈进行不同进制间的数字转换。代码示例涵盖了顺序存储和链式存储两种方式。
&spm=1001.2101.3001.5002&articleId=84445263&d=1&t=3&u=c7fceb7ff1764e0b8bbb9bbb5e73973c)
5167

被折叠的 条评论
为什么被折叠?



