首页 > 其他分享 >数据结构作业的代码——————栈的顺序实现

数据结构作业的代码——————栈的顺序实现

时间:2022-10-18 16:33:36浏览次数:68  
标签:Status SElemType return SqStack top 作业 base 数据结构 顺序


作业code1:

  • 将上课给的顺序表形式实现栈的程序补充(代码已发给大家):
  • 实现通过键盘进行插入
  • 实现通过键盘进行删除
  • 良好的人机交互

发的代码:

#include <stdio.h>
#include <malloc.h>

typedef int SElemType;
typedef int Status;
#define
#define
#define
#define
#define
#define
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;

//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}

//清空栈
Status ClearStack(SqStack *s)
{
s->top = s->base;
return Ok;
}

//栈是否为空
Status StackEmpty(SqStack *s)
{
if(s->top == s->base)
return True;
else
return False;
}

//销毁栈
Status Destroy(SqStack *s)
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize=0;
return Ok;
}

//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
if(s->top == s->base)
return Error;
e = *(s->top - 1);
return Ok;
}

//压栈
Status Push(SqStack *s, SElemType e)
{
if(s->top - s->base >= s->stacksize)//栈满
{
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base + s->stacksize;//修改栈顶位置
s->stacksize += STACKINCREMENT;//修改栈长度

}
*s->top++ = e;
return Ok;
}

//弹栈
Status Pop(SqStack *s, SElemType *e)
{
if(s->top == s->base)
return Error;
--s->top;
*e = *(s->top);
return Ok;
}

//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
SElemType *t = s->top;
while(t > b)
visit(*b++);
printf("\n");
return Ok;
}

Status visit(SElemType c)
{
printf("%d ",c);
return Ok;
}

int main()
{
SqStack a;
SqStack *s = &a;
SElemType e;
InitStack(s);
int n;
puts("请输入要进栈的个数:");
scanf("%d", &n);
while(n--)
{
int m;
scanf("%d", &m);
Push(s, m);
}
StackTraverse(s, visit);
puts("");
puts("8进栈后:");
Push(s, 8);
StackTraverse(s, visit);
puts("");
Pop(s, &e);
printf("出栈的元素是:%d\n", e);
printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中
Destroy(s);
return 0;
}
  • J17-4-name-code-第二次-栈.cpp

感觉就是给它换了个衣服,函数基本上都没有发上变化
明天

#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
typedef int SElemType;
typedef int Status;
#define
#define
#define
#define
#define
#define
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;

//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}

//清空栈
Status ClearStack(SqStack *s)
{
s->top = s->base;
return Ok;
}

//栈是否为空
Status StackEmpty(SqStack *s)
{
if(s->top == s->base)
return True;
else
return False;
}

//销毁栈
Status Destroy(SqStack *s)
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize=0;
return Ok;
}

//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
if(s->top == s->base)
return Error;
e = *(s->top - 1);
return Ok;
}

//压栈
Status Push(SqStack *s, SElemType e)
{
if(s->top - s->base >= s->stacksize)//栈满
{
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base + s->stacksize;//修改栈顶位置
s->stacksize += STACKINCREMENT;//修改栈长度

}
*s->top++ = e;
return Ok;
}

//弹栈
Status Pop(SqStack *s, SElemType *e)
{
if(s->top == s->base)
return Error;
--s->top;
*e = *(s->top);
return Ok;
}

//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
SElemType *t = s->top -1;
while(t >= b)
visit(*t--);
// visit(*b++);
printf("\n");
return Ok;
}

Status visit(SElemType c)
{
printf("%d ",c);
return Ok;
}
void menu()
{
cout<<" menu:"<<endl;
cout<<"1.进栈"<<endl;
cout<<"2.出栈"<<endl;
cout<<"3.输出"<<endl;
cout<<"4.menu"<<endl;
cout<<"0.结束"<<endl;
}
void preface()
{
printf(" *********************************************\n"
" * *\n"
" * 此程序的功能: *\n"
" * 将整数类型的数据进行栈的操作 *\n"
" * *\n"
" *********************************************\n"
"\n\n"
);
}
int main()
{
SqStack a;
SqStack *s = &a;
SElemType e;
InitStack(s);
preface();
menu();
int choose;
int x;
while(true)
{
cout<<"\n请选择:";
cin>>choose;
int k=0;
switch(choose)
{
case 1:
printf("请输出需要进栈的个数:");
cin>>x;
printf("请输入%d个元素:",x);
while(x--)
{
cin>>e;
Push(s,e);
}
// printf("进栈成功!\n");
break;
case 2:
Pop(s,&e);
printf("出栈的元素是:%d\n", e);
break;
case 3:
StackTraverse(s, visit);
printf("栈已全部输出!\n");
break;
case 4:
menu();
break;
case 0:
k=1;
break;
default:
printf("请重新输入!");
break;
}
if(k) break;
}
Destroy(s);
return 0;
}


标签:Status,SElemType,return,SqStack,top,作业,base,数据结构,顺序
From: https://blog.51cto.com/u_15834888/5767183

相关文章