XZY数据结构基础(1)

一,术语

1)数据(Data)

	1数据满足条件:①存储在某种介质上②可识别③物理符号
	2数据要具备的要素:①类型(Type) ②值(Value)
	3数据元素(Data Element)——识别信息的基本组成单位:
	①若干个数据的集合。
	②用来表示现实世界的一个完整信息。

2) 数据结构

包括:1逻辑结构2.物理(存储)结构
1)逻辑结构:数据集合中数据元素之间存在的逻辑关系。
A>集合式联系:数据元素之间是散列的——没有什么联系。
B>线性联系:数据元素之间存在线性联系。
C>非线性联系:①树状②图状
2)物理结构:数据元素的物理存储结构。
A>顺序存储:用连续的存储单元完成存储。(顺序表)
B>链式存储:用不连续的存储单元完成存储。
衡量标准:①逻辑结构:时间复杂度②物理结构:空间复杂度

二.线性表

1.线性表:表示数据集合中数据元素之间的逻辑关系。
表示:
①数据集合(有哪些数据元素,不讲次序)
②数据元素之间的逻辑次序
【例】:DataList={春,夏,冬,秋}
逻辑次序:
①图例:春-夏-秋-冬
②二元组:DataRelationship={<春,夏>,<夏,秋>,<秋,冬>}
线性表特点:<前驱元素,后继元素>
在这里插入图片描述

  1. 有且只有一个结点元素无前驱元素。
  2. 有且只有一个结点元素无后继元素。
  3. 除首尾结点外,其余结点只有一个前驱,一个后继。

首元素:线性表中没有前驱的线性元素。
尾元素:线性表中没有后继的线性元素。
非终端元素:线性表中有唯一前驱和唯一后继的元素。

三.顺序表(标准数据结构)

1.顺序表:用连续的存储单元(顺序存储)来存储线性表。
区分: ⑴顺序表是线性⑵顺序表用数组存储
2.实现顺序表:

  • 有一个数据集合(逻辑)
  • 有一个数组(连续的存储单元)
    声明连续的存储单元(数组):
    ①定义一个数组:数据类型 数组名[元素个数]
    ★②声明一个动态数组
    A>malloc函数: i> malloc(字节数)
    [例] malloc(4) 问题①
    返回值
  • 分配成功:返回首字节地址
  • 分配失败:返回NULL。
    ★若单元分配成功,返回首字节地址,但该地址无类型(void * )。
    解决:通过强制类型转换。
    【例】在内存中分配4B的整型单元
  int * p;
  p=(int *)malloc(4);   //强制类型转换 void*转换成int *
  *p=10;
  printf("%d",*p);    //out:10

改进:

  int *p;
  p=(int *)malloc(sizeof(int));
  *p=10;
  printf("%d",*p);       //out:10

[例]通过malloc分配有5个元素的整型数组

   int * p;
   p=(int *)malloc(5 *sizeof(int));
   if(!p) {
	printf("分配失败!\n");
}
else{
	for(int i=o;i<5;++i){
	p[i]=i+1;
 	}
}
	for(int i=0;i<5;++i)
	printf("%5d",p[i]);
	free(p);

★用malloc分配的单元必须用free释放:free(指针);

要在C++中使用顺序栈(通常基于数组实现)模拟这个场景,我们需要创建一个可以动态进出栈并且保持特定出栈顺序的栈。我们可以采用类似于双端队列(deque)的数据结构,因为它的添加和删除操作可以在两端进行,这将有助于我们实现XZY的出栈顺序。 下面是一个简单的实现思路: 1. 定义一个栈`Stack`,它包含一个`std::deque<char>`用于存储元素。 2. 当元素XYZ依次入栈时,正常入队。 3. 当需要按照XZY出栈时,首先弹出并返回第一个元素X,然后如果栈非空,继续弹出下一个元素Y,直到栈为空或栈顶元素不是Z。 以下是代码示例: ```cpp #include <deque> using namespace std; class Stack { private: deque<char> elements; public: // 入栈操作 void push(char item) { elements.push_back(item); } // 出栈操作,按XZY顺序返回元素 char pop_XZY() { if (elements.empty()) return '\0'; // 如果栈为空则返回结束符 while (!elements.empty() && elements.back() != 'Z') { if (elements.front() == 'X') { char temp = elements.front(); elements.pop_front(); // 弹出X return temp; // 返回X } else { elements.pop_back(); // 否则,如果不是Z,就直接移除 } } if (!elements.empty()) { return elements.front(); // 如果只剩Z,也返回Z } else { return '\0'; // 如果栈已空,返回结束符 } } }; int main() { Stack s; s.push('X'); s.push('Y'); s.push('Z'); char result; while ((result = s.pop_XZY()) != '\0') { cout << result; // 输出 XZY } return 0; } ``` 注意,此实现假设输入始终为XYZ且不会重复。如果有其他条件或需求,可以根据实际情况调整代码。此外,当栈中所有元素都已被处理完,`pop_XZY`函数会返回结束符`\0`表示出栈完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值