两种堆栈实现

本文介绍了使用静态数组和链表两种方式实现堆栈的基本方法,并通过一个将十进制数转换为八进制数的例子展示了堆栈的应用。文章涵盖了堆栈的基本操作如压栈、弹栈、检查栈顶元素等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

=====================================================================================================================
//用静态数组实现堆栈
#include<stdio.h>
#include<assert.h>
 
#define STACK_TYPE int//栈里面所存数据的类型
#define STACK_SIZE 100//栈的大小
 
static STACK_TYPE stack[STACK_SIZE];
static int top_element = -1;//用top_element来标记栈顶元素的下标
 
void push(STACK_TYPE value);//压栈操作
void pop(void);//弹出栈顶的一个值,并将其丢弃
STACK_TYPE top(void);//返回栈顶的一个值,并不对栈进行修改
int is_empty(void);//如果栈为空,返回TRUE,否则返回FALSE
int is_full(void);//如果栈为满,返回TRUE,否则返回FALSE
 
int main(){
int i=0,k=0;
printf("please input 1 number:\n");
scanf("%d",&i);
while(i){ //实现将十进制转换为八进制//还有一道题为十转十六
k=i%8;
push(k);
i=i/8;
}
while(!is_empty()){ //如果栈不为空,那么就输出栈顶元素,并出栈
printf("%d\n",top());
pop(); //出栈
}
return 0;
}
 
void push(STACK_TYPE value){
assert( !is_full() );//断言堆栈不是满的
top_element += 1;//先加一,再压栈
stack[ top_element ] = value;
}
 
void pop(void){
assert( !is_empty() );
top_element -= 1; //出栈
}
STACK_TYPE top(void){
assert( !is_empty() );
return stack[ top_element]; //访问栈顶值
}
int is_empty(void){
return top_element == -1; //栈是否为空
}
int is_full(void){
return top_element ==STACK_SIZE-1; //栈满了没有?
}
===========================================================================================================================
//用链表实现堆栈
//单链表实现椎栈,在头插入与删除元素
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
 
#define STACK_TYPE int //椎栈中的元素
 
typedef struct shi_to_ba{
int num;
struct shi_to_ba *next;
}STACK;
 
void push(STACK_TYPE value);
void pop(void);
STACK_TYPE top(void);
int is_empty();
 
 
static STACK *head=NULL;//椎栈头指针,
 
 
int main(){
int i=0,k=0;
printf("please input 1 integer:\n");
scanf("%d",&i);
while(i){
k=i%8;
push(k);
i=i/8;
}
while(!is_empty()){
printf("%d\n",top());
pop();
}
return 0;
}
 
 
 
void push(STACK_TYPE value){
STACK *tmp;
tmp=(STACK *)malloc(sizeof(STACK));
Assert(tmp != NULL);
   tmp->num=value;
/*
   if(head==NULL){
tmp->next=NULL; //右边等价tmp->next = head;
}else{
tmp->next=head;
}
   */
head=tmp;
}
void pop(void){
STACK *tmp=head;
assert(!is_empty());
head=head->next;
free(tmp);
}
 
STACK_TYPE top(void){
assert(!is_empty());
return head->num;
}
int is_empty(){
return head==NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值