栈是 仅限定在表尾插入或输出的一种链表形式,它不能像链表一样随便输出、随便插入,是一种“先进后出”的形式,可以理解为逆序输出。
1.写顺序栈,我们需要先在头文件部分定义一个存储空间初始分配量和一个存储空间分配增量
#include
#include
#define MAX 100//第一次分配内存空间时分配100
#define ADD 10//当我们输入的数据大于初始空间时就增加内存空间,每次增加10
2.然后是定义结构体变量,定义三个,栈顶指针、栈底指针、栈的大小
typedef struct stack{
int stacksize;
int *base;
int *top;
}stack;
3.初始化栈,先给栈分配空间,然后使栈顶等于栈底
int InitStack(stack &s){
s.base = (int*)malloc(MAX*sizeof(int));//这句的意思是给指针s.base分配int的大小乘以MAX字节的空间,并转化为int类型
if(s.base == 0){
printf("存储失败!");
}
s.top = s.base;
s.stacksize = MAX;
return 0;
}
4.判断是否为空栈,s.base=s.top
int StackEmpty(stack s){
if(s.top == s.base){
printf("栈为空!");
}
return 0;
}
5.求栈的长度
int StackLength(stack s){
printf("\n");
int count = 0;
if(s.top == s.base){
printf("栈为空!");
}
while(s.top != s.base){
s.top--;
count ++;
}
printf("栈的长度为:%d",count);
return 0;
}
6.求栈顶元素
int GetTop(stack s,int &e){
if(s.top == s.base){
printf("栈为空!");
}
e = *(s.top-1);//s.top-1表示s.top的前一个指针,*(s.top-1)表示该指针指向的变量的值
return 0;
}
7.在栈顶插入元素
int PushStack(stack &s,int e){
if(s.top - s.base >= MAX){
s.base = (int*)realloc(s.base,(s.stacksize + ADD)*sizeof(int));//申请(s.stacksize+ADD)个int型空间,并且把s.base里的内容复制过去
if(!s.base){
printf("内存分配失败!");
}
s.top = s.base + MAX;
s.stacksize = s.stacksize + ADD;
}
*s.top = e;//*s.top表示s.top指针指向的变量的值,让这个值等于e
s.top++;//栈顶指针加一
return 0;
}
7.删除栈顶元素
int PopStack(stack &s,int e){
if(s.top == s.base){
printf("栈为空!");
}
else{
s.top--;
e = *s.top;
}
printf("\n栈顶元素为:%d",e);
return 0;
}
8.遍历栈
int PrintStack(stack s){
if(s.base == s.top){
printf("栈为空!");
}
int *p;//定义一个p指针
p = s.top;//让它指向s.top
printf("输出栈中所有数据:");
while(p > s.base){
p--;
printf("%d ",*p);//*p表示p指向的变量值
}
return 0;
}
9.进制转换(十进制转换为八进制)
int BaseConversion(stack &s){
int N;
InitStack(s);
printf("\n请输入十进制数:");
scanf("%d",&N);
printf("十进制数%d转换为八进制数为:",N);
while(N != 0){
PushStack(s,N % 8);
N = N/8;
}
while(s.top != s.base){
s.top--;
printf("%d",*s.top);
}
return 0;
}
10.主函数
int main(){
stack s,p;
int i,n,m,e;
InitStack(s);
printf("你想要输入几个数据:");
scanf("%d",&n);
printf("请输入数据:");
for(i = 0;i < n;i++){
++s.top;
scanf("%d",s.top-1);
}
PrintStack(s);
StackLength(s);
printf("\n输入要插入的数据:");
scanf("%d",&m);
PushStack(s,m);
PrintStack(s);
PopStack(s,e);
BaseConversion(p);
return 0;
}
以上程序依次写入Dev-C++和vscode均可运行
欢迎大家可以提出建议,希望可以与各位共同学习,增长知识!!