如何使用C推送堆栈中的元素



我试图在C中学习堆栈。但无法执行推送操作,因为它显示了一些错误。控制台中没有显示错误消息。但是在运行代码时,它在执行peek方法时显示了一个错误的top值。

#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef enum{FALSE,TRUE} boolean;
typedef struct stack{
int top;
int a[MAX];
}stack;
void CreateStack(stack s){
s.top = -1;
}
boolean isEmpty(stack s){
return (s.top == -1);
}
boolean isFull(stack s){
return(s.top == MAX - 1);
}
void push(stack s, int data){
if(isFull(s)){
printf("Stack is Fulln");
exit(1);
}
else{
s.top = s.top + 1;
s.a[s.top] = data;
}
}
void pop(stack s){
if(isEmpty(s)){
printf("Stack is Empty");
exit(1);
}
else{
printf("%dn",s.a[s.top]);
s.top = s.top - 1;
}
}
int peek(stack s){
return s.a[s.top];
}
void main(){
stack s;
CreateStack(s);
int num;
push(s,1);
push(s,2);
push(s,15);
printf("Top value = %dn",peek(s));
}

问题是您没有修改作为参数传递的结构。每个函数都有一个本地副本,该副本在函数结束时不存在。以下是pushmain函数的示例。对所有功能进行相同的更改。

void push(stack *s, int data){
if(isFull(s)){
printf("Stack is Fulln");
exit(1);
}
else{
s->top = s->top + 1;
s->a[s->top] = data;
}
}
void main(){
stack s;
CreateStack(&s);
push(&s,1);
push(&s,2);
push(&s,15);
printf("Top value = %dn",peek(&s));
}

您可以避免使用isEmptyisFullpeek的指针,因为它们不会修改任何内容。但我认为对所有这些应用程序使用相同的界面是最简单的。为了安全起见,您可以像bool isFull(stack const *s)一样申报

最新更新