2020.10.8问题.
本题要求在一个数组中实现两个堆栈。
函数接口定义:
Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag );
其中Tag
是堆栈编号,取1或2;MaxSize
堆栈数组的规模;Stack
结构定义如下:
typedef int Position; struct SNode { ElementType *Data; Position Top1, Top2; int MaxSize; }; typedef struct SNode *Stack;
注意:如果堆栈已满,Push
函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop
函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #define ERROR 1e8 typedef int ElementType; typedef enum { push, pop, end } Operation; typedef enum { false, true } bool; typedef int Position; struct SNode { ElementType *Data; Position Top1, Top2; int MaxSize; }; typedef struct SNode *Stack; Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); Operation GetOp(); /* details omitted */ void PrintStack( Stack S, int Tag ); /* details omitted */ int main() { int N, Tag, X; Stack S; int done = 0; scanf("%d", &N); S = CreateStack(N); while ( !done ) { switch( GetOp() ) { case push: scanf("%d %d", &Tag, &X); if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag); break; case pop: scanf("%d", &Tag); X = Pop(S, Tag); if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag); break; case end: PrintStack(S, 1); PrintStack(S, 2); done = 1; break; } } return 0; } /* 你的代码将被嵌在这里 */
输入样例:
5 Push 1 1 Pop 2 Push 2 11 Push 1 2 Push 2 12 Pop 1 Push 2 13 Push 2 14 Push 1 3 Pop 2 End
输出样例:
Stack 2 Empty Stack 2 is Empty! Stack Full Stack 1 is Full! Pop from Stack 1: 1 Pop from Stack 2: 13 12 11
存在的问题:
以下为自己写的代码,理论上逻辑并没有问题,但是运行一直超时。
Stack CreateStack(int MaxSize) { Stack S = (Stack)malloc(sizeof(struct SNode)); S->Data = (int*)malloc(MaxSize * sizeof(int)); S->Top1 = 0; S->Top2 = MaxSize-1; S->MaxSize = MaxSize; return S; } bool Push(Stack S, ElementType X, int Tag) { if (S->Top1 > S->Top2) { printf("Stack Full\n"); return false; } if (Tag == 1) { S->Data[S->Top1++] = X; } else { S->Data[S->Top2--] = X; } return true; } ElementType Pop(Stack S, int Tag) { if (Tag == 1) { if (S->Top1 == 0) { printf("Stack %d Empty\n", Tag); return ERROR; } return S->Data[--S->Top1]; } if (S->Top2 == S->MaxSize-1) { printf("Stack %d Empty\n", Tag); return ERROR; } return S->Data[++S->Top2]; }
而其他大佬的代码
Stack CreateStack(int MaxSize)//双栈结构即为两个栈共享一块空间 { Stack stack = (struct SNode *)malloc(sizeof(struct SNode));//先为栈分配一个空间 stack->Data = (int *)malloc(sizeof(ElementType)* MaxSize);//为栈分配一个Macsize大小的数组空间存放值 stack->Top1 = -1; stack->Top2 = MaxSize; stack->MaxSize = MaxSize; return stack; } bool Push(Stack S, ElementType X, int Tag)//入栈操作 { if (!S)//这个栈空间不存在,分配失败的时候 return false; if (S->Top1+1==S->Top2)//栈满的情况 { printf("Stack Full\n"); return false; } if (Tag == 1) S->Data[++S->Top1] = X; else S->Data[--S->Top2] = X; return true; } ElementType Pop(Stack S, int Tag) { if (!S) return ERROR; if (Tag == 1) { if (S->Top1 == -1) { printf("Stack %d Empty\n",Tag); return ERROR; } return S->Data[S->Top1--]; } if (S->Top2 == S->MaxSize) { printf("Stack %d Empty\n", Tag); return ERROR; } return S->Data[S->Top2++]; }
运行起来就不超时,而两者代码的区别仅仅只是对栈操作的方式不同:
自己的代码是先放元素再移动top,而大佬的代码是先移动top再存放元素。
这两种操作为何会出现不同的结果,目前自己也不太清楚。
先放在这里记录一下吧,有空再回来想想。
如果大佬知道可以联系我 q1398339379.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~