请写出顺序栈的入栈函数,即往栈中插入元素e为新的栈顶元素

//试题中用到的头文件
#include <stdio.h>
#include <stdlib.h>
//试题中用到的通用数据类型和宏
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
(3)已知栈中用到的数据类型和宏
typedef int SElemType;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //当前分配的存储空间
}SqStack;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
请写出顺序栈的入栈函数,即往栈中插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e )
(4)已知队列中用到的数据类型和宏
typedef int QElemType;
typedef struct qnode
{
QElemType data;
struct qnode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
请完成入队操作函数
Status EnQueue(LinkQueue &Q, QElemType e )

题目中给出了顺序栈的数据结构定义和宏定义,以及入栈函数Push的函数声明。要实现入栈功能,可以按照如下步骤进行:

判断栈是否已满,如果已满则需要扩展栈的存储空间。
将新元素e压入栈顶。
修改栈顶指针top的位置,使其指向新的栈顶位置。
返回操作结果。
根据上述步骤,可以编写如下入栈函数的代码:

Copy code
// SqStack的顺序栈入栈函数,将元素e压入栈顶
function Push(S, e) {
// 判断栈是否已满,如果已满则需要扩展栈的存储空间
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S.base) {
exit(OVERFLOW);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}

// 将新元素e压入栈顶
*(S.top++) = e;

return OK;
}
在入栈函数中,首先判断栈是否已满,如果已满则需要扩展栈的存储空间。这里可以使用realloc函数来实现,其参数为需要重新分配空间的指针、新的空间大小和新的内存对齐方式(一般可以忽略)。如果分配成功,则将base指针指向新的存储空间,并修改stacksize的值。然后,将新元素e压入栈顶,即将e存储到top所指向的位置,并将top指针向上移动一个位置。最后,返回操作结果OK即可。

需要注意的是,在使用malloc和realloc函数分配内存后,需要检查返回的指针是否为NULL,如果是则表示分配失败,需要及时退出程序并进行错误处理。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-07
Status Push(SqStack &S, SElemType e )
{
int len=s.top-s.base
if( len>=stcaksize)
{
ElemType *newbase;
newbase=new ElemType[stacksize+STACKINCREMENT];
for(int i=0;i< len;i++)
*(newbase+i)=*(base+i);
delete []base;
stacksize+=STACKINCREMENT;
base=newbase;
top=base+ len;
}
*(s.top)=e;
s.top++;
return OK;
}
第2个回答  2011-06-07
Status Push(SqStack &s,SElemType e)
{
*(s->top)++=e;
}
第3个回答  2011-06-07

000
第4个回答  2011-06-16
0本回答被提问者采纳
相似回答