栈和链栈的实现

1、栈的实现

//创建一个简单的栈
#include<stdio.h>
#include<stdlib.h>
typedef struct stack
{
int* data;
int size;
int head;
}STACK;
void initialize(STACK*);
void add(STACK*);
int delete_s(STACK*);
void initialize(STACK* stack)
{
printf_s("您想建立多大的栈?\n");
scanf_s("%d", &stack->size);
stack->data =(int*)malloc(sizeof(int));
stack->head = 0;
}
void add(STACK* stack)
{
int m;
if (stack->head <= stack->size)
{
printf("请输入您要插入的数字\n");
scanf("%d", &m);
stack->data[stack->head] = m;
stack->head++;
}
else
printf("栈已经空了!\n");
}
int delete_s(STACK* stack)
{
int value;
if (stack->head != 0)
{
value = stack->data[stack->head];
stack->head--;
}
else
printf("该栈已经空了!\n");
return value;
}
void show_stack(STACK* stack)
{
int temp = stack->head--;//注意这里栈要向下减一
printf("该栈的内容是:\n");
while (temp != 0)
{
printf("%d ", stack->data[temp--]);//注意这里temp也要减一,这里与循环队列不同,是因为循环队列里面有个front,是从front输出。
temp--;
}
printf("\n");
}
int main(void)
{
STACK stack;
initialize(&stack);
int choice;
while (1)//注意因为下面利用了switch所以不能应用c primer plus第八章中的getchar()与scanf组合的方法。
{
printf("按下列选项选择您要进行的操作\n");
printf("1.添加数字\n");
printf("2.删除数字\n");
printf("3.显示栈\n");
printf("4.退出\n");
scanf_s("%d",&choice);
switch (choice)
{
case 1:
add(&stack); break;
case 2:
delete_s(&stack); break;
case 3:
show_stack(&stack); break;
case 4:
return 0;
default:
break;
}


}
printf("谢谢您的使用!\n");
}

2.链栈的实现





//创建一个简单的链栈,链栈应用单链表的前插法来建立,这样整好内容可以反向输出,但是本算法中由于把STACK*作为参数,所以直接利用了一个头结点来做前插,也是比较简单好用的方法。
#include<stdio.h>
#include<stdlib.h>
typedef long ElemType;
typedef struct stack
{
ElemType data;
struct stack* next;
}STACK;
void initialize(STACK*);
void add(STACK*);
void delete_s(STACK*);
void get_top(STACK*);
void initialize(STACK* top)
{
top->next = NULL;//这里的top就相当于一个头结点指针。这个是头节点!!!!
}
void add(STACK* top)
{
ElemType m;
puts("请问您想插入的数字是?\n");
scanf("%d", &m);
STACK* temp;
temp = (STACK*)malloc(sizeof(STACK));
temp->data = m;
temp->next = top->next;
top->next = temp;
}
void delete_s(STACK* top)
{
ElemType value;
STACK* temp;
temp = top->next;//这里写错了
value = top->next->data;
top->next = temp->next;
free(temp);
printf("删除了%d\n",value);
}
void get_top(STACK* top)
{
printf("栈顶是%d",top->next->data);
}
int main(void)
{
STACK top;
initialize(&top);
int choice;
while (1)//注意因为下面利用了switch所以不能应用c primer plus第八章中的getchar()与scanf组合的方法。
{
printf("按下列选项选择您要进行的操作\n");
printf("1.添加数字\n");
printf("2.删除数字\n");
printf("3.显示栈顶\n");
printf("4.退出\n");
scanf_s("%d",&choice);
switch (choice)
{
case 1:
add(&top); break;
case 2:
delete_s(&top); break;
case 3:
get_top(&top); break;
case 4:
return 0;
default:
break;
}


}
printf("谢谢您的使用!\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值