栈初始化,入栈,出栈功能的实现

  1 //////////////////////////////////////////////////////////
  2 // stack.cpp
  3 //
  4 // author:Leetao
  5 //////////////////////////////////////////////////////////
  6 // 简介:
  7 //   线性表的实现
  8 //////////////////////////////////////////////////////////
  9 /**
 10 * 栈初始化,入栈,出栈功能的实现
 11 *
 12 * @author Leetao
 13 * @version 1.0
 14 * @date 2014.11.22
 15 */
 16 #include<stdio.h>
 17 #include<malloc.h>
 18
 19 #define STACK_INIT_SIZE 100  //储存空间初试分配量
 20 #define STACKINCREMENT 10   //储存空间分配增量
 21
 22 //类型宏定义,此处定义为int型
 23 typedef  int SElem;
 24 typedef  int Status;
 25
 26 typedef struct
 27 {
 28     SElem *base;  //在栈构造之前和销毁之后,base的值为NULL
 29     SElem *top;   //栈顶指针
 30     int stacksize;
 31 }SqStack;
 32
 33 //函数声明
 34 Status InitStack(SqStack &S);
 35 Status GetTop(SqStack &S,SElem &e);
 36 Status Push(SqStack &S,SElem e);
 37 Status Pop(SqStack &S,SElem &e);
 38
 39 //栈初始化
 40 Status InitStack(SqStack &S)
 41 {
 42     S.base=(SElem *)malloc(STACK_INIT_SIZE*sizeof(SElem));
 43     if(S.base==NULL)
 44     {
 45         printf("error!\n");
 46         return 0;
 47     }
 48     S.top=S.base;
 49     S.stacksize=STACK_INIT_SIZE;
 50
 51     return 0;
 52 }
 53
 54 //返回栈顶元素
 55 Status GetTop(SqStack &S,SElem &e)
 56 {
 57     if(S.base==S.top)
 58     {
 59         printf("the stack is null!\n");
 60         return  0;
 61     }
 62
 63     e=*(S.top-1);
 64
 65     return 0;
 66 }
 67
 68 //插入元素
 69 Status Push(SqStack &S,SElem e)
 70 {
 71     if(S.top-S.base>=S.stacksize)  //栈满,追加储存空间
 72     {
 73         S.base=(SElem *)realloc(S.base,
 74         (S.stacksize+STACKINCREMENT)*sizeof(SElem));
 75
 76         if(S.base==NULL)
 77         {
 78             printf("error!\n");
 79             return 0;
 80         }
 81
 82         S.top=S.base+S.stacksize;
 83         S.stacksize+=STACKINCREMENT;
 84     }
 85     *S.top++=e;
 86
 87
 88     return 0;
 89 }
 90
 91 //删除栈顶元素
 92 Status Pop(SqStack &S,SElem &e)
 93 {
 94     if(S.top==S.base)
 95     {
 96         printf("error!\n");
 97         return 0;
 98     }
 99     e=*(--S.top);
100
101     return 0;
102 }
103
104 int main()
105 {
106     SqStack S;
107     int n,e;
108         InitStack(S);
109         printf("输入一个非负的十进制数,打印与其等值的八进制数:\n");
110         scanf("%d",&n);
111
112         while(n)
113         {
114             Push(S,n%8);
115             n=n/8;
116         }
117
118         printf("最后转换结果为:\n");
119         while(S.top!=S.base)
120         {
121             Pop(S,e);
122             printf("%d",e);
123         }
124
125
126     return 0;
127
128 }

栈初始化,入栈,出栈

时间: 2024-12-19 05:25:35

栈初始化,入栈,出栈功能的实现的相关文章

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步

给定入栈顺序,判断出栈顺序是否正确。

1 var ins = [1, 2, 3, 4, 5]; 2 var outs = [3, 4, 5, 2, 1]; 3 var temp = ins; 4 var num, i = 0, len; 5 6 /** 7 * ins 入栈顺序 8 * outs 出栈顺序 9 * temp 临时数组,保存入栈顺序 10 * num 是临时数组中 当前出栈节点的下标 11 * len 临时数组的长度-1 12 * 13 */ 14 (function (temp, outs) { 15 if(ins

n个元素的入栈顺序有多少种出栈顺序?

问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的分析过程如下: n个数据依次入栈,出栈顺序种数的递推公式如下:F(n)=∑(F(n-1-k)*Fk);其中k从0到n-1 已知F0=1,F1=F0*F0=1F2=F1*F0+F0*F1=2F3=F2*F0+F1*F1+F0*F2=5F4=F3*F0+F2*F1+F1*F2+F0*F3=14F5=F4

顺序栈的进栈,出栈

1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 100 4 5 typedef struct 6 { 7 char c[MAX]; 8 int top; 9 }*seqstack; 10 11 void InitStack(seqstack s);//建立一个空栈 12 int push(seqstack s,char a);//进栈 13 int pop(seqstack s,char *a);//出栈 14 15 i

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素

顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置.通常以top=-1表示空栈. 代码如下: #include<iostream> using namespace std; #define  TRUE 1 #define  FALSE 0 //顺序栈的存储结构 #define Stack_Size 50 //设栈中元素个数为50 typedef struct { int elem

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋值*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define OK 1#define ERROR 0#define NAMESIZE 255//字符串的最大长度

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

编程实现栈的入栈/出栈操作

完整代码如下,其实队栈都只是链表的一种变化而已 #include <stdio.h> #include <stdlib.h> typedef struct student * PNode; typedef struct stacklink * PStack; typedef struct student { int data; PNode next; }Node; typedef struct stacklink { PNode zhandi; PNode top; }Stack;