C++建立一个空栈,并按要求完成链栈的相关操作: 编写入栈函数,随机产生10个100以内的整数,并按输入顺序依次入栈,考虑判断上溢情况,编写出栈函数,从键盘输入出栈元素个数n(n<10),将n个元素出栈并显示出栈元素,考虑判断下溢情况,编写取栈顶元素函数,若栈不为空,则取出栈顶元素显示;否则提示栈空。
时间: 2023-06-09 21:02:50 浏览: 103
好的,我明白了。回答您的问题:
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_SIZE 10 // 定义栈的最大容量
typedef struct Node {
int data;
struct Node* next;
}Node, *Stack;
Stack createStack(); // 新建空栈
int push(Stack s, int data); // 入栈
int pop(Stack s, int n); // 出栈
void getTop(Stack s); // 获取栈顶元素
int isEmpty(Stack s); // 判断栈是否为空
int isFull(Stack s); // 判断栈是否已满
int main()
{
srand((unsigned int)time(NULL)); // 设置随机种子,防止每次运行结果一样
Stack s = createStack(); // 新建空栈
printf("按顺序入栈的随机数为:");
for (int i = 0; i < 10; i++) {
int data = rand() % 100;
printf("%d ", data);
if (isFull(s)) {
printf("\n栈已满,无法入栈!\n");
break;
}
push(s, data); // 入栈
}
printf("\n");
printf("请输入要出栈的元素个数n(n<10):");
int n;
scanf_s("%d", &n);
if (isEmpty(s)) {
printf("栈已空,无法出栈!\n");
}
else if (n > 0) {
if (n > MAX_SIZE) {
printf("n大于栈的容量,已修改为栈的最大容量!\n");
n = MAX_SIZE; // 最多只能出栈栈的最大容量个元素
}
pop(s, n); // 出栈
}
else {
printf("n必须大于0!\n");
}
getTop(s); // 获取栈顶元素
return 0;
}
Stack createStack()
{
Stack s = (Stack)malloc(sizeof(Node));
if (!s) {
printf("创建栈失败!\n");
exit(1);
}
s->next = NULL;
return s;
}
int push(Stack s, int data)
{
Node* p = (Node*)malloc(sizeof(Node));
if (!p) {
printf("申请空间失败!\n");
exit(1);
}
p->data = data;
p->next = s->next;
s->next = p;
return 1;
}
int pop(Stack s, int n)
{
printf("按顺序出栈的%d个元素为:", n);
for (int i = 0; i < n; i++) {
if (isEmpty(s)) { // 判断下溢情况
printf("\n栈已空,%d个元素未出栈!\n", n - i);
break;
}
int data = s->next->data;
printf("%d ", data);
Node* p = s->next;
s->next = p->next;
free(p);
}
printf("\n");
return 1;
}
void getTop(Stack s)
{
if (isEmpty(s)) { // 判断栈空情况
printf("栈已空!\n");
}
else {
printf("栈顶元素为:%d\n", s->next->data);
}
}
int isEmpty(Stack s)
{
return s->next == NULL;
}
int isFull(Stack s)
{
Node* p = (Node*)malloc(sizeof(Node));
if (!p) {
return 1; // 申请空间失败,认为栈已满
}
free(p);
return 0;
}
```
希望我的回答对您有所帮助!
阅读全文