动态栈

/*
* =====================================================================================
*
* Filename: dynamic_stack.c
*
* Description:
*
* Version: 1.0
* Created: 2011年10月25日 16时53分20秒
* Revision: none
* Compiler: gcc
*
* Author: Wang Ran (), wangran51@126.com
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
#include <stdlib.h>
struct stack_node
{
int data;
struct stack_node *next_ptr;
};


void push(struct stack_node** node, int n);
int pop(struct stack_node** node);
int is_empty(struct stack_node* node);
void print_stack(struct stack_node* node);
void instructions(void);


int main()
{
struct stack_node * stack_ptr = NULL;//在第第一次push的时候NULL会被复制到top_ptr->next_ptr中
//所以这句是必须的
int i, choice, value;


for(i=0; i<5; i++)
{
printf("Enter an interger:");
scanf("%d", &value);
push(&stack_ptr, value);
//print_stack(stack_ptr);
}


for(i=0;i<5;i++)
{


if(!is_empty(stack_ptr))
{
printf("the poped value is %d\n ", pop(&stack_ptr));
}
print_stack(stack_ptr);
}

printf("end of run \n ");




return EXIT_SUCCESS;
}


void instructions(void)
{
printf("Enter choice: \n 1:push\n 2:pop\n 3:end\n ");
}
void push(struct stack_node ** top_ptr, int info)
{
struct stack_node * new_ptr;
new_ptr = malloc(sizeof (struct stack_node));
if(new_ptr != NULL)
{
new_ptr->data = info;
new_ptr->next_ptr = *top_ptr;
*top_ptr = new_ptr;
}
else
{
printf("%d not inserted, No memory available. \n", info);
}
}
int pop(struct stack_node** top_ptr)
{
struct stack_node* temp_ptr;
int pop_value;
temp_ptr = *top_ptr;
pop_value = (*top_ptr)->data;
*top_ptr = (*top_ptr)->next_ptr;
free(temp_ptr);
return pop_value;
}
void print_stack(struct stack_node* current_ptr)
{
if(current_ptr == NULL)
{
printf("the stack is empty.\n");
}
else
{
while(current_ptr != NULL)
{
printf("%d-->", current_ptr->data);
current_ptr = current_ptr->next_ptr;
}
printf("NULL\n ");
}
}
int is_empty(struct stack_node * top_ptr)
{
return top_ptr == NULL;
}

**高校专业实习管理平台设计与实现** 本设计项目旨在构建一个服务于高等院校专业实习环节的综合性管理平台。该系统采用当前主流的Web开发架构,基于Python编程语言,结合Django后端框架与Vue.js前端框架进行开发,实现了前后端逻辑的分离。数据存储层选用广泛应用的MySQL关系型数据库,确保了系统的稳定性和数据处理的效率。 平台设计了多角色协同工作的管理模型,具体包括系统管理员、院系负责人、指导教师、实习单位对接人以及参与实习的学生。各角色依据权限访问不同的功能模块,共同构成完整的实习管理流程。核心功能模块涵盖:基础信息管理(如院系、专业、人员信息)、实习过程管理(包括实习公告发布、实习内容规划、实习申请与安排)、双向反馈机制(单位评价与学生反馈)、实习支持与保障、以及贯穿始终的成绩评定与综合成绩管理。 在技术实现层面,后端服务依托Django框架的高效与安全性构建业务逻辑;前端界面则利用Vue.js的组件化特性与LayUI的样式库,致力于提供清晰、友好的用户交互体验。数据库设计充分考虑了实习管理业务的实体关系与数据一致性要求,并保留了未来功能扩展的灵活性。 整个系统遵循规范的软件开发流程,从需求分析、系统设计、编码实现到测试验证,均进行了多轮迭代与优化,力求在功能完备性、系统性能及用户使用体验方面达到较高标准。 **核心术语**:实习管理平台;Django框架;MySQL数据库;Vue.js前端;Python语言。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
动态顺序是顺序的一种,它是使用顺序存储结构实现的后进先出(Last In First Out, LIFO)的数据结构,类似于一摞叠加的盘子,最后放入的盘子必须先取出,元素的添加和删除操作都发生在顶,通过动态数组实现,与普通顺序不同的是它能够动态调整容量大小[^1]。 其工作原理基于动态数组。初始时会分配一定大小的存储空间作为的初始容量。当向中添加元素(入操作)时,会先检查是否已满。如果已满,就会重新分配一块更大的内存空间,将原中的元素复制到新的空间,释放原空间,然后再将新元素添加到顶。删除元素(出操作)时,直接将顶指针下移,减少中元素数量。 以下是一个简单的动态顺序的 C 语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #define INIT_SIZE 10 #define INCREMENT 5 typedef struct { int *data; int top; int capacity; } DynamicStack; // 初始化 DynamicStack* initStack() { DynamicStack *stack = (DynamicStack*)malloc(sizeof(DynamicStack)); stack->data = (int*)malloc(INIT_SIZE * sizeof(int)); stack->top = -1; stack->capacity = INIT_SIZE; return stack; } // 判断是否为空 int isEmpty(DynamicStack *stack) { return stack->top == -1; } // 判断是否已满 int isFull(DynamicStack *stack) { return stack->top == stack->capacity - 1; } // 入操作 void push(DynamicStack *stack, int value) { if (isFull(stack)) { stack->capacity += INCREMENT; stack->data = (int*)realloc(stack->data, stack->capacity * sizeof(int)); } stack->data[++(stack->top)] = value; } // 出操作 int pop(DynamicStack *stack) { if (isEmpty(stack)) { printf("Stack is empty!\n"); return -1; } return stack->data[(stack->top)--]; } // 释放内存 void freeStack(DynamicStack *stack) { free(stack->data); free(stack); } int main() { DynamicStack *stack = initStack(); push(stack, 10); push(stack, 20); printf("Popped: %d\n", pop(stack)); freeStack(stack); return 0; } ``` 动态顺序在很多场景都有应用。在编译器中,语法分析时会使用来处理表达式的括号匹配、运算符优先级等问题。在操作系统中,进程的调用使用结构来保存函数调用的上下文信息,实现函数的嵌套调用和返回。在浏览器的历史记录管理中,使用来实现前进和后退功能,用户访问新页面时将页面信息入,后退时出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值