请编制C程序,利用栈的顺序存储方式实现以下功能,栈的初始化、入栈、出栈、取栈顶元素、遍历栈等操作并利用栈的操作实现数制转换问题。 要求: (1)根据屏幕菜单的选择,进行顺序栈的初始化、入栈、出栈、取栈顶元素、遍历栈的操作,并在入栈、出栈操作后输出栈中的元素,出栈和取栈顶元素后要输出栈顶元素的值;最后在屏幕菜单中选择0,即可结束程序的运行。 (2)栈中存储的数据在键盘上输入,栈中存储的数据类型定义为long int,入栈的数据为每个小组同学的学号,把自己的学号放在栈顶,出栈和取栈顶元素后要把栈顶自己的学号输出出来。 (3)栈的最大存储空间用常量定义,每个算法前要给出适当的注释说明,程序中相应的位置加入输入输出提示语句。 (4)数制转换问题中,转换的数值和需要转换的进制数在函数的参数中进行设置。
时间: 2023-12-23 19:04:07 浏览: 108
采用顺序存储实现栈的初始化、入栈、出栈操作
以下是实现上述要求的C程序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 栈的最大存储空间
typedef struct {
long int data[MAXSIZE]; // 存储数据的数组
int top; // 栈顶指针
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == MAXSIZE - 1;
}
// 入栈操作
void push(Stack* s, long int x) {
if (isFull(s)) {
printf("Stack is full!\n");
return;
}
s->data[++(s->top)] = x;
printf("Push %ld success!\n", x);
}
// 出栈操作
void pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return;
}
long int x = s->data[(s->top)--];
printf("Pop %ld success!\n", x);
}
// 取栈顶元素
void getTop(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return;
}
long int x = s->data[s->top];
printf("Top element is %ld.\n", x);
}
// 遍历栈中的元素
void traverse(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return;
}
printf("The elements in stack are:\n");
for (int i = s->top; i >= 0; i--) {
printf("%ld ", s->data[i]);
}
printf("\n");
}
// 数制转换
void conversion(int n, int base) {
Stack s;
initStack(&s);
while (n > 0) {
push(&s, n % base);
n /= base;
}
printf("The converted number is: ");
while (!isEmpty(&s)) {
printf("%ld", s.data[(s.top)--]);
}
printf("\n");
}
int main() {
int choice;
long int x;
while (1) {
printf("Please choose the operation:\n");
printf("1. Initialize stack\n");
printf("2. Push element into stack\n");
printf("3. Pop element out of stack\n");
printf("4. Get top element of stack\n");
printf("5. Traverse stack elements\n");
printf("6. Convert number system\n");
printf("0. Exit\n");
scanf("%d", &choice);
switch (choice) {
case 1:
{
Stack s;
initStack(&s);
printf("Initialize stack success!\n");
break;
}
case 2:
{
printf("Please input the element to push: ");
scanf("%ld", &x);
push(&s, x);
traverse(&s);
break;
}
case 3:
{
pop(&s);
traverse(&s);
break;
}
case 4:
{
getTop(&s);
break;
}
case 5:
{
traverse(&s);
break;
}
case 6:
{
int n, base;
printf("Please input the number to convert: ");
scanf("%d", &n);
printf("Please input the base to convert: ");
scanf("%d", &base);
conversion(n, base);
break;
}
case 0:
{
printf("Exit!\n");
exit(0);
}
default:
{
printf("Invalid choice!\n");
break;
}
}
}
return 0;
}
```
在上述程序中,我们定义了一个结构体`Stack`表示栈,包含一个存储数据的数组和一个栈顶指针`top`。然后,我们分别实现了栈的初始化、入栈、出栈、取栈顶元素、遍历栈和数制转换等操作。在主函数中,我们根据用户的选择,调用相应的函数来执行相应的操作。
阅读全文