Stack creakEmptyStack() { Stack p; p=(Stack)malloc(sizeof(Node)); //申请一个空间 if(p) { p->next=NULL; return p; } } //------------将元素压入栈---------------- void push(int x,int y,Stack s) { Stack p; p=(Stack)malloc(sizeof(Node)); if(p) { //如果申请空间成功则用头插法将元素压入 p->x=x; p->y=y; if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点 else p->next=s->next; //否则将p插入头结点之后 s->next=p; } else { printf("No space!\n"); } } //-------------检测栈是否为空-------------- int isEmpty(Stack s) { //为空则返回1,不为空返回0 if(s->next==NULL) return 1; else return 0; } //--------------将元素弹出栈---------------- void pop(Stack s) { Stack p; p=s->next; if(p->next) { s->next=p->next; free(p); } else return; } //------------取栈顶元素------------------ Node top(Stack s) { Node t; //判断是否为空,若不为空则返回 t=*(s->next); return t; } C语言解释
时间: 2023-09-18 09:13:17 浏览: 37
这段代码实现了一个栈的基本操作,包括创建一个空栈、将元素压入栈、检测栈是否为空、将元素弹出栈以及获取栈顶元素。其中,创建空栈使用了动态内存分配函数malloc,将元素压入栈使用了头插法,将元素弹出栈使用了free函数释放内存。判断栈是否为空,是通过判断栈顶指针的下一个指针是否为空来实现的。获取栈顶元素是通过返回栈顶指针的下一个结点来实现的。
相关问题
Stack creakEmptyStack() { Stack p; p=(Stack)malloc(sizeof(Node)); //申请一个空间 if(p) { p->next=NULL; return p; } } //------------将元素压入栈---------------- void push(int x,int y,Stack s) { Stack p; p=(Stack)malloc(sizeof(Node)); if(p) { //如果申请空间成功则用头插法将元素压入 p->x=x; p->y=y; if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点 else p->next=s->next; //否则将p插入头结点之后 s->next=p; } else { printf("No space!\n"); } } //-------------检测栈是否为空-------------- int isEmpty(Stack s) { //为空则返回1,不为空返回0 if(s->next==NULL) return 1; else return 0; } //--------------将元素弹出栈---------------- void pop(Stack s) { Stack p; p=s->next; if(p->next) { s->next=p->next; free(p); } else return; } //------------取栈顶元素------------------ Node top(Stack s) { Node t; //判断是否为空,若不为空则返回 t=*(s->next); return t; }
这段代码实现了一个栈的基本操作,包括创建一个空栈、将元素压入栈、检测栈是否为空、将元素弹出栈以及获取栈顶元素。其中,创建空栈使用了动态内存分配函数malloc,将元素压入栈使用了头插法,将元素弹出栈使用了free函数释放内存。判断栈是否为空,是通过判断栈顶指针的下一个指针是否为空来实现的。获取栈顶元素是通过返回栈顶指针的下一个结点来实现的。
需要注意,pop函数中的判断条件应该为 `if(p)` 而不是 `if(p->next)`。因为当栈为空时,p会指向NULL,此时判断p->next是否为空会引发异常。
// 定义双向栈数据结构 typedef struct { int top[2]; // 两个栈的栈顶指针 int maxsize; // 栈的最大长度 int *data; // 栈的存储空间 } DoubleStack; // 初始化双向栈 void InitStack(DoubleStack *S, int maxsize) { S->maxsize = maxsize; S->data = (int *) malloc(maxsize * sizeof(int)); S->top[0] = -1; // 初始化第一个栈的栈顶指针 S->top[1] = maxsize; // 初始化第二个栈的栈顶指针 } // 入栈操作 void Push(DoubleStack *S, int i, int x) { if (S->top[1] - S->top[0] == 1) { printf("Stack overflow!\n"); // 栈满,无法入栈 return; } if (i == 0) { // 对第一个栈进行操作 S->top[0]++; S->data[S->top[0]] = x; } else if (i == 1) { // 对第二个栈进行操作 S->top[1]--; S->data[S->top[1]] = x; } else { printf("Invalid stack index!\n"); // 栈号错误 } } // 出栈操作 void Pop(DoubleStack *S, int i, int *x) { if (i == 0) { // 对第一个栈进行操作 if (S->top[0] == -1) { printf("Stack underflow!\n"); // 栈空,无法出栈 return; } *x = S->data[S->top[0]]; S->top[0]--; } else if (i == 1) { // 对第二个栈进行操作 if (S->top[1] == S->maxsize) { printf("Stack underflow!\n"); // 栈空,无法出栈 return; } *x = S->data[S->top[1]]; S->top[1]++; } else { printf("Invalid stack index!\n"); // 栈号错误 } }
这段代码实现了一个双向栈数据结构,其中包括初始化双向栈、入栈操作和出栈操作。双向栈是两个栈共享一个数组空间,可以从两端进行入栈和出栈操作。
在初始化双向栈时,需要指定最大长度,并分别初始化两个栈的栈顶指针。在入栈操作时,需要指定是对哪个栈进行操作,如果栈满则无法入栈。在出栈操作时,同样需要指定是对哪个栈进行操作,如果栈空则无法出栈。
这段代码可以用于实现一些需要同时维护两个栈的算法,比如表达式求值、括号匹配等。
阅读全文