用一维数组实现栈(C++编程思想 p120)

1 实现思路

向栈中插入4个元素后的状态

执行过程分析:

2 代码实现

clib.h 接口定义

 1 typedef struct CStashTag
 2 {
 3     int ele_size;                    //栈中每个元素的占用的字节数
 4     int capacity;                    //栈的容量,栈当前(不扩展)可容纳的元素的个数
 5     int next;                        //相当于栈指针(标记下一个空位索引),栈中当前元素的个数
 6     unsigned char* storage;            //栈存储空间字符指针,动态分配的字节数组
 7 } CStash;
 8
 9 void initalize(CStash* s, int size);
10 void cleanup(CStash* s);
11 int add(CStash* s, const void* element);
12 void* fetch(CStash* s, int index);
13 int count(CStash* s);
14 void inflate(CStash* s, int increase = 10);

2 Clib.cpp 函数实现

  1 #include <string>
  2 #include <iostream>
  3 #include <cassert>
  4 #include "clib.h"
  5
  6 using namespace std;
  7
  8 void initalize(CStash* s, int sz)
  9 {
 10     s->ele_size = sz;
 11     s->capacity = 0;
 12     s->next = 0;
 13     s->storage = 0;
 14 }
 15
 16 int add(CStash* s, const void* element)
 17 {
 18     if (s->next  >=  s->capacity)
 19     {
 20         inflate(s);
 21     }
 22     int startBytes = s->next * s->ele_size;
 23     unsigned char* e = (unsigned char*)element;
 24
 25     for (int i=0; i<s->ele_size; i++)
 26         s->storage[startBytes + i] = e[i];
 27     s->next++;
 28
 29     return s->next - 1;
 30 }
 31
 32 //取出索引index处的栈元素
 33 void* fetch(CStash* s, int index)
 34 {
 35     assert(0 <= index);
 36     if (index >= s->next)
 37     {
 38         return 0;
 39     }
 40     return &(s->storage[index * s->ele_size]);
 41 }
 42
 43 //返回栈中元素的个数
 44 int count(CStash* s)
 45 {
 46     return s->next;
 47 }
 48
 49 //扩展栈空间,增加increase个元素空间
 50 void inflate(CStash* s, int increase)
 51 {
 52     printf("inflate increase %d\n", increase);
 53
 54     assert(increase > 0);
 55
 56     //原栈长 + 增加的栈元素个数
 57     int newCapacity = s->capacity + increase;
 58     int newBytes = newCapacity * s->ele_size;   //新的栈空间字节数
 59     int oldBytes = s->capacity * s->ele_size;        //旧的栈空间字节数
 60
 61     unsigned char* b = new unsigned char[newBytes]; //在堆上分配新的栈空间
 62
 63     if (!oldBytes)
 64     {
 65         //拷贝旧的栈空间的内容到新的栈空间,并释放旧的栈空间
 66         //把旧内存块中的数据拷贝到新分配的内存块
 67         for (int i=0; i<oldBytes; i++)
 68             b[i] = s->storage[i];
 69         delete [] (s->storage); //释放旧的内存块
 70     }
 71
 72
 73     s->storage = b; //使栈存储空间字符指针s->storage指向新分配的内存块
 74     s->capacity = newCapacity; //更新栈的容量
 75 }
 76
 77
 78 //清理栈存储空间字符指针
 79 void cleanup(CStash* s)
 80 {
 81     if (s->storage != 0)
 82     {
 83         cout<<"freeing storage"<<endl;
 84         delete []s->storage;
 85     }
 86 }
 87
 88
 89 int main(int argc, char* argv[])
 90 {
 91
 92     CStash stash;
 93
 94     char str1[] = "d1111";
 95     char str2[] = "d2222";
 96     char str3[] = "d3333";
 97     char str4[] = "d4444";
 98
 99     initalize(&stash, 20);
100
101     add(&stash, str1);
102     add(&stash, str2);
103     add(&stash, str3);
104     add(&stash, str4);
105
106     unsigned char* result = (unsigned char*)fetch(&stash, 2);
107     printf("fetch result %s\n", result);
108
109     return 0;
110 };

输出:

inflate increase 10
fetch result d3333

时间: 2025-01-22 13:38:01

用一维数组实现栈(C++编程思想 p120)的相关文章

编程题:已知一个一维数组a[10]中有10个数,求出第m个数到第n个数的和。其中m、n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int n,m,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; printf("Please input m and n(m<n<10):\n"); scanf("%d,%d",&m,&am

编程题:指针变量,实参与形参的引用。已知一个一维数组,求其中前n个数的和。n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=a; scanf("%d",&num); printf("%d\n",sum(p,num)); } 编程题:指针变量,实参与形参的引用.已知

编程题:已知一个一维数组,求其中前n个数的和。n由键盘输入

#include<stdio.h> int sum(int array[],int n) { int i,s=0; for(i=0;i<n;i++) s+=array[i]; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; scanf("%d",&num); printf("%d\n",sum(a,num)); } 编程题:已知一个一维数组,求其中前n个数的和.

编程题:实现一维数组初始化的几种形式。

#include<stdio.h> void main() { int n; int a[5]={0,1,2,3,4}; int b[5]={1,2}; float c[]={1,2,3,4,5}; for(n=0;n<5;n++) printf("%5d",a[n]); printf("\n"); for(n=0;n<5;n++) printf("%5d",b[n]); printf("\n"); f

使用一维数组实现共享栈操作

所谓的共享栈就是两个虚拟的栈使用一块固定大小的数组元素,涉及到如何不冲突的进行入栈出栈操作.对一维数组即在数组两头设置两个栈顶标记(指针).然后分别这两个进行入栈出栈操作.当前面的栈标记位置+1=后面栈的位置,那么不可以进行入栈操作,如果两个栈有在栈底(对前面的来说是top1==-1,后一个是top2==n)是不可以进行出栈操作的. 结构图如下: //函数根据operate这个字符串内容是push还是pop,flag是1还是2表示是前面一部分栈还是后一部分栈,n表示共享栈stack_array[

java数组实现买彩票(二个一维数组的比较思想)

1 /** 2 设计一个程序,模拟从彩球池里随机抽取5个彩球(彩球池里一共有11个彩球,编号为1~11), 3 要求在控制台打印出这5个被取出来的彩球的编号(注意编号不能重复). 4 思路: 5 1.创建一个int类型的一维数组balls,用来保存11个彩球的编号 6 2.创建一个boolean类型的一维数组flags,用来保存11个彩球的状态,默认全部为false 7 (比如:flags[0]=true,意味着编号等于balls[0]的这个彩球已经被取出来了) 8 3.去彩球池里取钱之前,先生

java编程思想总结(二)

java编程思想总结(二) java编程思想总结是一个持续更新的系列,是本人对自己多年工作中使用到java的一个经验性总结,也是温故而知新吧,因为很多基础的东西过了这么多年,平时工作中用不到也会遗忘掉,所以看看书,上上网,查查资料,也算是记录下自己的笔记吧,过一段时间之后再来看看也是蛮不错的,也希望能帮助到正在学习的人们,本系列将要总结一下几点: 面向对象的编程思想 java的基本语法 一些有趣的框架解析 实战项目的整体思路 代码的优化以及性能调优的几种方案 整体项目的规划和视角 其它遗漏的东西

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度

编程思想与算法

常用编程思想与算法 本文是在阅读Aditya Bhargava先生算法图解一书所做的总结,文中部分代码引用了原文的代码,在此感谢Aditya Bhargava先生所作出的这么简单的事例,对基础算法感兴趣的朋友可以阅读原文.由于本人也是编程初学者,所以本书比较浅显易懂,所介绍的算法配上插图也十分易懂,这里只是介绍几种最基础的算法由浅入深以帮助理顺一些简单的思维逻辑. 算法简介 算法是一组完成任务的指令.任何代码片段都可视为算法,我们这里讨论的算法要么速度快,要么能解决有趣的问题,要么兼而有之. 二