要求编写功能函数实现堆栈的定义,分别基于顺序栈和链栈:按用户要求输入元素,编写进栈函数push();编写出栈函数pop();编写判断栈满和栈空的函数 ;遍历栈,并输出元素;实现十进制到二进制的转换。c语言实现完整代码
时间: 2024-06-03 09:07:30 浏览: 97
将x入栈修改栈顶指针:top=p-数据结构中的栈和队列
//顺序栈
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} SqStack;
//初始化栈
void InitStack(SqStack *s) {
s->top = -1;
}
//判断栈是否为空
int IsEmpty(SqStack *s) {
if(s->top == -1) {
return 1;
}
else {
return 0;
}
}
//判断栈是否为满
int IsFull(SqStack *s) {
if(s->top == MAXSIZE-1) {
return 1;
}
else {
return 0;
}
}
//进栈
int Push(SqStack *s, int x) {
if(IsFull(s)) {
return 0;
}
else {
s->top++;
s->data[s->top] = x;
return 1;
}
}
//出栈
int Pop(SqStack *s, int *x) {
if(IsEmpty(s)) {
return 0;
}
else {
*x = s->data[s->top];
s->top--;
return 1;
}
}
//遍历栈
void TraverseStack(SqStack *s) {
int i;
for(i=0;i<=s->top;i++) {
printf("%d ",s->data[i]);
}
printf("\n");
}
//十进制转二进制
void DecToBin(int n) {
SqStack s;
InitStack(&s);
while(n) {
Push(&s,n%2);
n /= 2;
}
while(!IsEmpty(&s)) {
int x;
Pop(&s,&x);
printf("%d",x);
}
printf("\n");
}
int main() {
SqStack s;
InitStack(&s);
int n;
printf("请输入元素个数:");
scanf("%d",&n);
printf("请输入元素:");
int i,x;
for(i=0;i<n;i++) {
scanf("%d",&x);
Push(&s,x);
}
printf("栈中元素为:");
TraverseStack(&s);
printf("出栈元素为:");
while(!IsEmpty(&s)) {
int x;
Pop(&s,&x);
printf("%d ",x);
}
printf("\n");
DecToBin(10);
return 0;
}
//链栈
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} LinkStack;
//初始化栈
void InitStack(LinkStack **s) {
*s = NULL;
}
//判断栈是否为空
int IsEmpty(LinkStack **s) {
if(*s == NULL) {
return 1;
}
else {
return 0;
}
}
//进栈
int Push(LinkStack **s, int x) {
LinkStack *p = (LinkStack*)malloc(sizeof(LinkStack));
if(p == NULL) {
return 0;
}
else {
p->data = x;
p->next = *s;
*s = p;
return 1;
}
}
//出栈
int Pop(LinkStack **s, int *x) {
LinkStack *p = *s;
if(IsEmpty(s)) {
return 0;
}
else {
*x = p->data;
*s = p->next;
free(p);
return 1;
}
}
//遍历栈
void TraverseStack(LinkStack **s) {
LinkStack *p = *s;
while(p) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//十进制转二进制
void DecToBin(int n) {
LinkStack *s;
InitStack(&s);
while(n) {
Push(&s,n%2);
n /= 2;
}
while(!IsEmpty(&s)) {
int x;
Pop(&s,&x);
printf("%d",x);
}
printf("\n");
}
int main() {
LinkStack *s;
InitStack(&s);
int n;
printf("请输入元素个数:");
scanf("%d",&n);
printf("请输入元素:");
int i,x;
for(i=0;i<n;i++) {
scanf("%d",&x);
Push(&s,x);
}
printf("栈中元素为:");
TraverseStack(&s);
printf("出栈元素为:");
while(!IsEmpty(&s)) {
int x;
Pop(&s,&x);
printf("%d ",x);
}
printf("\n");
DecToBin(10);
return 0;
}
阅读全文