简单栈的c语言实现

#include<stdio.h>

#include<stdlib.h>

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct{

char name[10];

int score;

}student;

typedef struct {

student *base;

student *top;

int stacksize;

}SqStack;

SqStack InintStack(SqStack &S){

S.base=(student *)malloc(STACK_INIT_SIZE *sizeof(student));

if(!S.base) exit(1);

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

printf("bulid succeed\n");

return S;

}

bool ClearStack(SqStack &S){

/*while(S.top){

S.top=NULL;

S.top--;

if(S.top==S.base)

S.top=S.base=NULL;

}*/

S.top=S.base;

return true;

}

bool DestoryStack(SqStack &S){

free(S.base);

return true;

}

bool IsStackEmpty(SqStack &S){

if(S.top==S.base)

return true;

else

return false;

}

int StackLength(SqStack &S){

return (S.top-S.base);

}

bool GetTop(SqStack &S,student &e){

if(S.top==S.base){

return false;

}

e=*(S.top-1);

return true;

}

bool Push(SqStack &S,student e){

//printf("%d\n",e.score);

if(S.top-S.base>=S.stacksize){

S.base=(student *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(student));

if(!S.base) exit(1);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

* S.top=e;

S.top++;

return true;

}

bool Pop(SqStack &S,student &e){

if(S.top==S.base) return false;

e=*--S.top;

return true;

}

bool PrintStack(SqStack &S){

int i=0;

while((S.top-i)!=S.base){

i++;

printf("%s,%d\n",(*(S.top-i)).name,(*(S.top-i)).score);

}

return true;

}

int main(){

SqStack s;

InintStack(s);

int set,isclose;

student student_in,student_top;

/*student student[10];

for(int i=0;i<2;i++){

scanf("%s %d",student[i].name,&student[i].score);

Push(s,student[i]);

}

PrintStack(s);

*/

while(1){

set=0;

printf(" 1.插入学生\n 2.删除最后一个学生并输出\n 3.输出栈的长度\n 4.销毁栈\n 5.清空栈 \n 6.查询该栈是否为空 \n 7.输出最后一个学生\n 8.输出整个栈中的所有学生\n 9.建立栈(在销毁后重建)\n");

scanf("%d",&set);

switch(set){

case 1:printf("请输入学生的姓名和分数,用空格分隔\n");scanf("%s %d",student_in.name,&student_in.score);if(Push(s,student_in)) printf("插入成功\n");;break;

case 2:if(Pop(s,student_top))printf("%s,%d\n",student_top.name,student_top.score);else printf("栈里无学生\n");break;

case 3:printf("%d\n",StackLength(s));break;

case 4:if(DestoryStack(s)) printf("销毁成功\n");break;

case 5:if(ClearStack(s)) printf("清空成功\n");break;

case 6:if(IsStackEmpty(s)) printf("栈为空\n"); else printf("栈不为空\n");break;

case 7:if(GetTop(s,student_top))printf("%s,%d\n",student_top.name,student_top.score);else printf("栈里无学生\n");break;

case 8:PrintStack(s);break;

case 9:InintStack(s);break;

}

printf("结束输入0\n");

scanf("%d",&isclose);

if(!isclose) break;

}

return 0;

}

时间: 2024-12-25 08:29:54

简单栈的c语言实现的相关文章

51系列小型操作系统精髓 简单实现8 C语言版待改进

使用keil4  ,代码Code Optimization:0   运行OK 可运行8个任务 Program Size: data=21.0 xdata=0 code=401  (包括2个示例变量,未优化) 任务从中断处切换,在定时时间到后从定时中断中切换回来. 待改进地方 1.手动优化汇编程序 2. 重入问题 3.参数进函数和时中断的保护问题 #include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T

51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

51系列小型操作系统精髓 简单实现7 C语言版待改进

#include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms #define MAX_TASKS 2 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H. unsigned char idata task_tim

C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. 1 #pragma once 2 #include<iostream> 3 #include<string> 4 #include<stdlib.h> 5 using namespace std; 6 7 template <class T> 8 class Vector 9 { 10 publ

51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)

4个任务 /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. PC指针为16位,需2个字节tas

排序(2)---------简单插入排序(C语言实现)

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 通俗解释: ①假设初始序列的第一个元素是有序的(当一个序列只有1个元素时,我们可以认为其是有序的). ②从第二个元素开始与前面的元素进行比较,如果比前面的大

51系列小型操作系统精髓 简单实现12 C语言版加保护参数

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

链栈的c语言实现

1.链栈结构 typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; 2.构造一个空栈S Status InitStack(LinkStack *S) { S->top = (LinkStackPtr)malloc(sizeof(StackNode));

如何自学Struts2之Struts2值栈和OGNL语言[视频]

如何自学Struts2之Struts2值栈和OGNL语言[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95