未纠错
堆栈顺序储存
//关于堆栈顺序储存与链式储存的区别:
//链式储存在push函数中,每添加一个新元素,需要malloc一个新的小链表,即每次都需要声明一个小结构体
//而顺序储存除了在create使用过一次结构体之外,此外均使用数据和MaxSize进行调控
//即结构体内成员储存数据(链式)与结构体内数组储存数据(顺序)的区别
#include<stdio.h>
#include<stdlib.h>
#define ERROR -1
typedef int ElemType;
//typedef是否可以重载声明?
typedef int Position;
typedef struct Node {
ElemType* data; //储存元素的数组
//栈顶指针 这个指针(int类型)做什么用???
Position top; //top表示目前栈内元素个数
int MaxSize; //堆栈最大容量
};
typedef struct Node* Stack;
Stack CreateStack(int MaxSize)
{
Stack S = (Stack)malloc(sizeof(struct Node));
S->data = (ElemType*)malloc(MaxSize * sizeof(ElemType));
S->top = -1;
S->MaxSize = MaxSize;
return S;
}
bool IsFull(Stack S)
{
//为空时,最大容量为0, 0 - 1 = -1
return (S->top == S->MaxSize - 1);
}
bool push(Stack S, ElemType elem) {
if (IsFull(S)) {
printf("堆栈满");
return false;
}
else {
S->data[++(S->top)] = elem;
return true;
}
}
bool IsEmpty(Stack S)
{
return (S->top == -1);
}
ElemType pop(Stack S)
{
//出栈情况不需要free和调整逻辑结构,直接覆盖即可
if (IsEmpty(S)) {
printf("堆栈空");
return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
}
else
return (S->data[(S->top)--]);
}
int main() {
int max, elem;
scanf_s("%d %d", &max, &elem);
Stack S;
S = CreateStack(max);
int bool0;
bool0 = push(S, elem);
ElemType elem0;
elem0 = pop(S);
}
堆栈链式储存
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define ERROR -1
typedef int Position;
typedef int ElemType;
typedef struct Node {
ElemType data; //储存数据的数组
struct Node* next;
};
typedef struct Node* Stack;
Stack CreateStack()
{ /* 构建一个堆栈的头结点,返回该结点指针 */
Stack S;
S = (Stack)malloc(sizeof(struct Node));
S->next = NULL;
return S;
}
bool IsEmpty(Stack S)
{ /* 判断堆栈S是否为空,若是返回true;否则返回false */
return (S->next == NULL);
}
void push(Stack S, ElemType elem) {
//头插法 不然会丢失头指针
Stack S0;
S0 = (Stack)malloc(sizeof(Node));
//头指针S不储存数据
S->data = elem;
S0->next = (S->next);
S->next = S0;
//注意:这里传入形参是指针,即在地址上改变了堆栈数值
}
ElemType pop(Stack S) {
//需注意,栈顶头指针不储存数据,故 (S->next)->data 才有数据
Stack S1;
ElemType elem1;
//判断堆栈是否为空
if (IsEmpty(S)) {
printf("堆栈空");
return ERROR;
}
//核心操作:
S1 = S->next;
//这里右边必须是S1->next,注意,头指针不储存数据,故不需要变化,变化的是S->next
S->next = S1->next;
//这里不可以直接return S1->data,因为需要free掉malloc的内存
//return S1->data;
elem1 = S1->data;
free(S1);
return elem1;
}
int main() {
//注意:堆栈和队列不一样,堆栈使用数组
//头指针S不储存数据,且接下来的操作要注意头指针不可以丢失
Stack S;
S = (Stack)malloc(sizeof(Node));
S->next = NULL;
ElemType elem;
scanf_s("%d", &elem);
//入栈
push(S, elem);
//出栈 (删除并返回被出栈的栈顶元素数值)
pop(S);
}