要求编写功能函数实现堆栈的定义,分别基于顺序栈和链栈: (1)编写进栈函数push(); (2)编写出栈函数pop(); (3)编写判断栈满和栈空的函数 (4)遍历栈,并输出元素。c语言实现
时间: 2024-05-15 17:15:43 浏览: 75
1. 基于顺序栈的实现:
```c
#define MAXSIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE]; // 存放栈中元素的数组
int top; // 栈顶指针
} SeqStack;
// 进栈函数
void push(SeqStack *s, int x) {
if (s->top == MAXSIZE - 1) { // 栈满
printf("Stack is full.\n");
return;
}
s->top++; // 栈顶指针加1
s->data[s->top] = x; // 将元素x压入栈顶
}
// 出栈函数
int pop(SeqStack *s) {
if (s->top == -1) { // 栈空
printf("Stack is empty.\n");
return -1; // 返回-1表示出错
}
int x = s->data[s->top]; // 取出栈顶元素
s->top--; // 栈顶指针减1
return x; // 返回栈顶元素
}
// 判断栈满函数
int isFull(SeqStack s) {
if (s.top == MAXSIZE - 1)
return 1; // 栈满
else
return 0; // 栈未满
}
// 判断栈空函数
int isEmpty(SeqStack s) {
if (s.top == -1)
return 1; // 栈空
else
return 0; // 栈非空
}
// 遍历栈并输出元素
void traverse(SeqStack s) {
if (isEmpty(s)) { // 栈空
printf("Stack is empty.\n");
return;
}
printf("Stack elements: ");
for (int i = 0; i <= s.top; i++)
printf("%d ", s.data[i]);
printf("\n");
}
```
2. 基于链栈的实现:
```c
typedef struct node {
int data; // 存放元素
struct node *next; // 指向下一个节点的指针
} StackNode, *LinkStackPtr;
typedef struct {
LinkStackPtr top; // 栈顶指针
} LinkStack;
// 进栈函数
void push(LinkStack *s, int x) {
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)); // 创建新节点
p->data = x; // 存放元素
p->next = s->top; // 新节点指向原栈顶
s->top = p; // 栈顶指针指向新节点
}
// 出栈函数
int pop(LinkStack *s) {
if (s->top == NULL) { // 栈空
printf("Stack is empty.\n");
return -1; // 返回-1表示出错
}
int x = s->top->data; // 取出栈顶元素
LinkStackPtr p = s->top; // 暂存栈顶指针
s->top = s->top->next; // 栈顶指针指向下一个节点
free(p); // 释放原栈顶节点
return x; // 返回栈顶元素
}
// 判断栈空函数
int isEmpty(LinkStack s) {
if (s.top == NULL)
return 1; // 栈空
else
return 0; // 栈非空
}
// 遍历栈并输出元素
void traverse(LinkStack s) {
if (isEmpty(s)) { // 栈空
printf("Stack is empty.\n");
return;
}
printf("Stack elements: ");
LinkStackPtr p = s.top;
while (p != NULL) { // 依次输出栈中元素
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
阅读全文