用c语言 首先对栈的存储结构进行练习,接着实现栈的一些基本操作,最后运用栈解决一个实际问题,具体内容包括: 1.基于栈的顺序存储结构实现栈的初始化、入栈、出栈、取栈顶元素和判空操作。 2.基于上述栈的基本操作实现将一个十进制整数转换为对应二进制数。
时间: 2024-11-27 16:08:22 浏览: 9
在C语言中,我们通常会使用数组或动态内存分配(malloc)来实现栈的顺序存储结构。以下是栈的一些基本操作的实现步骤:
1. 初始化栈:
- 定义一个固定大小或动态大小的数组作为栈容器。
- 创建一个栈顶指针top,初始值为-1表示栈为空。
2. 入栈(push):
- 当需要添加一个元素时,如果栈未满(top + 1 < 数组长度),将新元素存放在top位置,并将top加一。
3. 出栈(pop):
- 如果栈非空(top >= 0),将栈顶元素赋给一个临时变量,然后top减一。
4. 取栈顶元素(peek):
- 返回栈顶元素,但不改变栈的状态,可以是`stack[top]`。
5. 判空(is_empty):
- 检查栈是否为空,即top == -1。
6. 将十进制整数转换为二进制:
- 使用栈辅助完成转换过程:
- 从右向左遍历十进制数,对于每一位:
- 如果该位大于0,则不断入栈1,直到该位变为0;
- 然后出栈所有元素,得到的是当前位之前的二进制数,将其追加到结果字符串的前面。
下面是一个简单的C语言示例,展示了如何使用数组实现栈及二进制转换:
```c
#include <stdio.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 入栈
void push(Stack *s, int val) {
if (s- 1) {
s->data[++s->top] = val;
} else {
printf("Stack overflow.\n");
}
}
// 出栈
int pop(Stack *s) {
if (s->top >= 0) {
return s->data[s->top--];
} else {
printf("Stack underflow.\n");
return -1; // 返回一个错误代码
}
}
// 获取栈顶元素
int peek(Stack *s) {
if (s->top >= 0) {
return s->data[s->top];
} else {
return -1; // 返回一个错误代码
}
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 十进制转二进制
void decimal_to_binary(int num, char *binary) {
Stack s;
init(&s);
while (num > 0) {
push(&s, num % 2);
num /= 2;
}
binary[0] = '\0';
while (!is_empty(&s)) {
binary = (binary + 1); // 移动字符串指针
*binary++ = '1'; // 写入1
pop(&s);
}
// 输出倒序的二进制数
for (int i = strlen(binary) - 1; i >= 0; i--) {
printf("%d", binary[i]);
}
}
int main() {
Stack s;
int decimal = 123;
char binary[20];
decimal_to_binary(decimal, binary);
return 0;
}
```
阅读全文