当前位置:网站首页>8583 顺序栈的基本操作
8583 顺序栈的基本操作
2022-08-02 14:02:00 【weixin_50862344】
题干
(自己去看好吧)
代码实现
#include<malloc.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量
typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
struct SqStack
{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈
Status InitStack(SqStack &S)
{
// 请补全代码
S.base= (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType*));
if(!S.base)
return ERROR;//这段一开始忘记加上去了
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
return OK;//这段一开始忘记加上去了,通过不了
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=STACK_INIT_SIZE)//扩展
{
S.base= (SElemType*)malloc((STACK_INIT_SIZE+STACKINCREMENT) *sizeof(SElemType*));
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top=e;
S.top++;
// 在栈S中插入元素e为新的栈顶元素
// 请补全代码
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top) return ERROR;
e=*(S.top-1);//TOP始终在栈顶元素的下一位
S.top--;
return OK;
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
// 请补全代码
}
Status GetTop(SqStack S,SElemType &e)
{
if(S.base==S.top) return ERROR;
e=*(S.top-1);
return OK;
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
// 请补全代码
}
int StackLength(SqStack S)
{
if(S.base==S.top)return 0;
int n;
n=S.top-S.base;
return n;
//return (int)(S.top-S.base);
// 返回栈S的元素个数
// 请补全代码
}
Status StackTraverse(SqStack S)
{
// 从栈顶到栈底依次输出栈中的每个元素
SElemType *p = (SElemType *)malloc(sizeof(SElemType));
p = S.top; //请填空
if(S.top==S.base)printf("The Stack is Empty!"); //请填空
else
{
printf("The Stack is: ");
p--;//小细节
while(p>=S.base) //请填空
{
//请填空
printf("%d ", *p);
p--;
}
}
printf("\n");
return OK;
}
int main()
{
int a;
SqStack S;
SElemType x, e;
if(InitStack(S)) // 判断顺序表是否创建成功,请填空
{
printf("A Stack Has Created.\n");
}
while(1)
{
printf("1:Push \n2:Pop \n3:Get the Top \n4:Return the Length of the Stack\n5:Load the Stack\n0:Exit\nPlease choose:\n");
scanf("%d",&a);
switch(a)
{
case 1: scanf("%d", &x);
if(!Push(S,x)) printf("Push Error!\n"); // 判断Push是否合法,请填空
else printf("The Element %d is Successfully Pushed!\n", x);
break;
case 2: if(!Pop(S,e)) printf("Pop Error!\n"); // 判断Pop是否合法,请填空
else printf("The Element %d is Successfully Poped!\n", e);
break;
case 3: if(!GetTop(S,e))printf("Get Top Error!\n"); // 判断Get Top是否合法,请填空
else printf("The Top Element is %d!\n", e);
break;
case 4: printf("The Length of the Stack is %d!\n",StackLength(S)); //请填空
break;
case 5:StackTraverse(S); //请填空
break;
case 0: return 1;
}
}
}
小细节
- 每次对基址进行操作(包括扩展,创建…),操作完都需要判断能否成功
(虽然好像并不会影响oj结果
if(!S.base) return ERROR;
- 进栈push中
*S.top=e;
top是栈顶指针,可以理解为:*操作使其变成像n一样的变量
- Status StackTraverse(SqStack S)函数中
SElemType *p = ______________________ //请填空
其实只要写 *SElemType p;
oj就可以通过
边栏推荐
猜你喜欢
随机推荐
第十单元 前后连调
Break the limit of file locks and use storage power to help enterprises grow new momentum
Flask框架
第三单元 视图层
EasyExcel 的使用
What is the difference between web testing and app testing?
第五单元 保持状态
logback源码阅读(一)获取ILoggerFactory、Logger
Sentinel源码(三)slot解析
监管再次重拳出击,后市如何?2021-05-22
Shell脚本完成pxe装机配置
rpm包的卸载与安装[通俗易懂]
Flask上下文,蓝图和Flask-RESTful
shell脚本“画画”
Flask项目的完整创建 七牛云与容联云
音频处理:浮点型数据流转PCM文件
第十二单元 关联序列化处理
Data Organization---Chapter 6 Diagram---Graph Traversal---Multiple Choice Questions
Gstreamer Plugin注册流程详解
How to solve mysql service cannot start 1069









