帮我用C语言写一个堆栈出栈入栈的函数吧
时间: 2023-02-22 19:21:43 浏览: 53
好的,以下是一个简单的C语言代码实现堆栈的出栈和入栈的函数。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
int stack[MAX_SIZE];
int top = -1;
void push(int value) {
if (top == MAX_SIZE - 1) {
printf("Error: Stack overflow\n");
return;
}
top++;
stack[top] = value;
}
int pop() {
if (top == -1) {
printf("Error: Stack underflow\n");
return -1;
}
int value = stack[top];
top--;
return value;
}
int main() {
push(1);
push(2);
push(3);
printf("%d\n", pop());
printf("%d\n", pop());
printf("%d\n", pop());
return 0;
}
```
希望对你有所帮助!
相关问题
帮我 利用“数组”作为存储结构方法实现“堆栈”的基本操作,包括:创建堆栈、入栈、出栈、空栈、满栈等操作写一个C语言程序
好的,下面是一个用数组实现堆栈的基本操作的C语言程序:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
int stack[MAX_SIZE];
int top = -1;
void createStack() {
top = -1;
}
void push(int value) {
if (top >= MAX_SIZE - 1) {
printf("Error: Stack overflow\n");
} else {
top++;
stack[top] = value;
}
}
int pop() {
int value = -1;
if (top < 0) {
printf("Error: Stack underflow\n");
} else {
value = stack[top];
top--;
}
return value;
}
int peek() {
return stack[top];
}
bool isEmpty() {
return top < 0;
}
bool isFull() {
return top >= MAX_SIZE - 1;
}
int main() {
createStack();
push(10);
push(20);
push(30);
printf("Top element: %d\n", peek());
while (!isEmpty()) {
int value = pop();
printf("Popped element: %d\n", value);
}
return 0;
}
```
在这个程序中,我们定义了一个长度为100的数组 `stack` 来作为堆栈的存储结构。`top` 用来记录堆栈顶部元素的下标,初始化为 -1 表示堆栈为空。
`createStack()` 函数用来创建一个空的堆栈,即将 `top` 重置为 -1。
`push()` 函数用来将元素入栈。如果堆栈已满,则输出错误信息;否则,将 `top` 加1并将元素存放在 `stack[top]` 中。
`pop()` 函数用来将元素出栈。如果堆栈为空,则输出错误信息;否则,将 `top` 减1并返回 `stack[top]` 中的元素。
`peek()` 函数用来查看堆栈顶部的元素,但不将其出栈。
`isEmpty()` 函数用来检查堆栈是否为空,即 `top` 是否小于0。
`isFull()` 函数用来检查堆栈是否已满,即 `top` 是否大于等于 MAX_SIZE - 1。
在 `main()` 函数中,我们首先调用 `createStack()` 函数创建一个空的堆栈,然后使用 `push()` 函数将三个元素入栈。接着使用 `peek()` 函数查看堆栈顶部的元素,并使用 `pop()` 函数将所有元素出栈并输出。
使用带有头节点的单链表来实现堆栈的存储,并在该物理结构上,实现堆栈的创建、判空、出栈、入栈等操作。 提示:采用C语言,在非递归方法中,可采用堆栈的入栈方法存储当前访问结点的父结点,采用出栈的方法获得当前访问结点的父结点。
好的,这是一个关于堆栈的数据结构问题。对于这个问题,我们可以使用带有头节点的单链表来实现堆栈的存储,具体实现如下:
```
typedef struct StackNode {
int data;
struct StackNode *next;
}StackNode, *Stack;
StackNode* createNode(int data) {
StackNode *node = (StackNode*)malloc(sizeof(StackNode));
node->data = data;
node->next = NULL;
return node;
}
void initStack(Stack *s) {
*s = createNode(0); // 头节点
}
int isEmpty(Stack s) {
return s->next == NULL;
}
void push(Stack *s, int data) {
StackNode *node = createNode(data);
node->next = (*s)->next;
(*s)->next = node;
}
int pop(Stack *s) {
if(isEmpty(*s)) {
printf("Stack is empty!\n");
exit(0);
}
StackNode *node = (*s)->next;
int data = node->data;
(*s)->next = node->next;
free(node);
return data;
}
int top(Stack s) {
if(isEmpty(s)) {
printf("Stack is empty!\n");
exit(0);
}
return s->next->data;
}
void clearStack(Stack *s) {
while(!isEmpty(*s)) {
pop(s);
}
}
```
在这个实现中,我们使用了带有头节点的单链表来存储堆栈,头节点的作用是方便操作。堆栈的创建使用了一个 initStack 函数,判断堆栈是否为空使用了 isEmpty 函数,入栈操作使用了 push 函数,出栈操作使用了 pop 函数,获取栈顶元素使用了 top 函数,清空堆栈使用了 clearStack 函数。这些函数的具体实现可以参考上述代码。
需要注意的是,这里的堆栈实现是非递归的,因此在出栈和入栈的过程中,我们采用堆栈的入栈方法存储当前访问结点的父结点,采用出栈的方法获得当前访问结点的父结点。
希望这个回答能够帮助你解决问题。
阅读全文