痹是什么意思| 拔罐为什么会起水泡| 富是什么生肖| 锹形虫吃什么| 腕管综合症吃什么药| 什么星座最花心| 肠胃炎不能吃什么| 如是什么意思| 脸上突然长斑是什么原因引起的| 十一月十一号是什么星座| 干涉是什么意思| 党群是什么意思| 治疗腱鞘炎用什么药效果好| 鸽子和什么一起炖汤最有营养| 什么车| 烟雾病是什么原因引起的| 木丹念什么| 妈妈是什么| 天地人和是什么意思| 新生儿老是打嗝是什么原因| 射精无力吃什么药最佳| 过肺是什么意思| 尿发黄是什么原因| 头皮痒用什么洗发水效果好| 月经量少吃什么调理最好方法| r代表什么意思| 吃什么补白细胞效果最好| 武汉都有什么区| 7月什么星座| 眼睛经常充血是什么原因引起的| 巨细胞病毒阳性什么意思| 纪梵希为什么不娶赫本| hbv是什么病毒| 必承其重上一句是什么| 属马的人佩戴什么招财| 载脂蛋白是什么意思| 六月十二日是什么日子| ca医学上是什么意思| 挛缩是什么意思| 143是什么意思| 什么杯子不能装水| 什么是胰腺癌| 低压高吃什么中成药| 惟妙惟肖什么意思| 什么手什么足| 陆陆续续是什么意思| 怀孕了吃什么药能打掉| 乐极生悲是什么意思| 大材小用是什么生肖| 支气管炎有什么症状| 做梦烧纸钱什么意思| 拔完智齿需要注意什么| 高压低是什么原因| 甲状腺跟甲亢有什么区别| p是什么医学| 隋朝之前是什么朝代| 几月初几是叫什么历| 岫玉是什么| wear是什么意思| 吃炒黑豆有什么好处和坏处| 时柱比肩是什么意思| 五粮液什么香型| 什么的朝霞| 人为什么会发烧| 尖斌卡引是什么意思| rsl是什么意思| 肺结节吃什么药能散结| 子宫肌瘤钙化是什么意思| 麻烦的意思是什么| 我是舅舅的什么人| 程字五行属什么| 吃猪肺有什么好处和坏处| 7月20日什么星座| 大象灰配什么颜色好看| dha什么时候吃最好| 乐字属于五行属什么| 夏天喝什么水最解渴| 桂圆不能和什么一起吃| 苦丁茶有什么功效| 当兵有什么要求| 4.12是什么星座| 子夜是指什么时间| 吃什么最养胃修复胃| 泮是什么意思| 欺骗餐是什么意思| 肝火旺盛是什么意思| 减肥早餐吃什么最好| 今年为什么闰六月| apgar评分是什么意思| 喝茉莉花茶有什么好处| 五路财神都叫什么名字| 什么是向量| 敬邀是什么意思| 女生排卵是什么意思| 木糖醇是什么东西| 红眼病不能吃什么东西| 痰中带血吃什么药| 消防队属于什么单位| 肝郁有什么症状| 婴儿黄疸高有什么影响| 乙亥日五行属什么| 桔子什么时候成熟| 碱性磷酸酶是什么| 西洋参不适合什么人吃| 交警大队长是什么级别| 青海有什么好玩的| iga肾病是什么病| 三伏贴能治什么病| 中耳炎挂什么科| 什么什么美景| 什么龟最贵| alienware是什么牌子| 戏谑是什么意思| 上唇肿胀是什么原因| 梦见打死猫有什么预兆| 阿托伐他汀钙片治什么病| 钠高是什么原因| 暮雪是什么意思| 为什么作什么的成语| 润字五行属什么| 口腔溃疡是缺少什么维生素| 头昏吃什么药效果最好| 睡觉流眼泪是什么原因| 吃什么可以淡斑| 12月1日是什么意思| 喉咙干痒吃什么药| 备孕需要补充什么| 鹅口疮是什么样的图片| 茧是什么意思| 什么是新陈代谢| 29周岁属什么生肖| 胃寒吃什么药好| 大豆是指什么豆| 孤军奋战是什么意思| 吃什么水果对肺好| 验血肝功能看什么指标| 喝啤酒不能吃什么| 梦到自己孩子死了是什么征兆| 前程无量是什么意思| 唐僧被封为什么佛| 补办身份证需要什么手续| 蜂窝织炎是什么病| 甲状腺2类是什么意思| 摩根石是什么| 10月30日是什么星座| 早晨醒来口苦是什么原因| n什么意思| 公元400年是什么朝代| 临床什么意思| 甲醛什么味道| 川字加一横是什么字| 五月十四号是什么情人节| 蓝色妖姬的花语是什么| 跑龙套是什么意思| 动物园有什么动物| 用什么点豆腐最健康| 什么的老虎| 基础代谢是什么| 食管反流用什么药| 血燥是什么意思| ri是什么意思| 魁罡贵人是什么意思| 宫颈炎有什么症状表现| 猪肝能钓什么鱼| 大校相当于地方什么级别| 肾结石用什么药| 头晕恶心想吐吃什么药| abo溶血是什么意思| 小孩测骨龄挂什么科| ck是什么品牌| 大自然的馈赠什么意思| 年上和年下是什么意思| 8月7日什么星座| 宇舶手表什么档次| 什么什么生机| 锦鲤是什么鱼| 何首乌长什么样子图片| 楼房风水主要看什么| 上面白下面本念什么| 九六年属什么的| 流苏是什么意思| 抽搐是什么原因引起的| 西夏国是现在什么地方| 前庭神经炎挂什么科| 每天尿都是黄的是什么原因| cr5是什么意思| 梅花什么时候开花| 什么价格| 露骨是什么意思| 绞丝旁一个奇念什么| 宫颈那囊什么意思| 菊花茶适合什么人喝| 房产税什么时候开始征收| spa按摩是什么意思| 检查头部应该挂什么科| 梦见死了人是什么征兆| 管教有方是什么意思| 呆萌是什么意思| 男人长阴虱是什么原因| 腰痛什么原因| 脸部浮肿什么原因| 香草是什么意思| 一什么| 知识是什么意思| 研讨会是什么意思| 移徒是什么意思| 促甲状腺激素偏高是什么意思| 肠胃型感冒吃什么药| 打喷嚏预示什么| 螃蟹一般吃什么| 兵役是什么意思| 入园体检都检查什么| 上海市长什么级别| 银子发黄是什么原因| 呕吐后吃什么食物好| 慢性结肠炎吃什么药| 吃黄瓜有什么好处| 宫颈炎用什么药| 剑客是什么意思| 士加一笔是什么字| 心肌梗塞有什么症状| 什么的嘴巴| 舂米是什么意思| 左腹部是什么器官| 心电图伪差是什么意思| 喝水有什么好处| 头晕想吐是什么原因| 尿酸低会引发什么症状| 鳞状上皮内高度病变什么意思| 双侧卵巢多卵泡是什么意思| 盛情款待是什么意思| 过会是什么意思| ca登录是什么意思| 吴京为什么看上谢楠| 阴道里面有个肉球是什么| 内分泌紊乱有什么症状表现| 孕妇梦见鱼是什么意思| 阴唇为什么一个大一个小| 什么是太监| 刘诗诗是什么样的人| 关节咔咔响是什么原因| 总打哈欠是什么原因| 7月26日是什么日子| 手上长汗疱疹用什么药| 牙齿有黑洞是什么原因| 3月16号是什么星座| 长期拉肚子是怎么回事什么原因造成| 左手臂麻木是什么征兆| 白头发吃什么可以改善| 凉拌菜用什么醋最好| 后背出汗多是什么原因| 胆固醇高对身体有什么危害| 入殓师是做什么的| 手发抖是什么原因引起的年轻人| 龙代表什么象征意义| 尿泡沫多是什么原因| 梦见跳舞是什么意思| 水印相机是什么意思| 坐怀不乱是什么生肖| 掰手指头响有什么危害| 724是什么意思| 薄荷脑是什么东西| 暴饮暴食会得什么病| 南瓜和什么相克| 百度

漳广原创广播剧获2017年度福建文艺发展基金项

百度 最大的变化在于变政府单项审批为政府与建设单位双向共同办事,实现了审批流程再造。

In computer science, an abstract data type (ADT) is a mathematical model for data types, defined by its behavior (semantics) from the point of view of a user of the data, specifically in terms of possible values, possible operations on data of this type, and the behavior of these operations. This mathematical model contrasts with data structures, which are concrete representations of data, and are the point of view of an implementer, not a user. For example, a stack has push/pop operations that follow a Last-In-First-Out rule, and can be concretely implemented using either a list or an array. Another example is a set which stores values, without any particular order, and no repeated values. Values themselves are not retrieved from sets; rather, one tests a value for membership to obtain a Boolean "in" or "not in".

ADTs are a theoretical concept, used in formal semantics and program verification and, less strictly, in the design and analysis of algorithms, data structures, and software systems. Most mainstream computer languages do not directly support formally specifying ADTs. However, various language features correspond to certain aspects of implementing ADTs, and are easily confused with ADTs proper; these include abstract types, opaque data types, protocols, and design by contract. For example, in modular programming, the module declares procedures that correspond to the ADT operations, often with comments that describe the constraints. This information hiding strategy allows the implementation of the module to be changed without disturbing the client programs, but the module only informally defines an ADT. The notion of abstract data types is related to the concept of data abstraction, important in object-oriented programming and design by contract methodologies for software engineering.[1]

History

edit

ADTs were first proposed by Barbara Liskov and Stephen N. Zilles in 1974, as part of the development of the CLU language.[2] Algebraic specification was an important subject of research in CS around 1980 and almost a synonym for abstract data types at that time.[3] It has a mathematical foundation in universal algebra.[4]

Definition

edit

Formally, an ADT is analogous to an algebraic structure in mathematics,[5] consisting of a domain, a collection of operations, and a set of constraints the operations must satisfy.[6] The domain is often defined implicitly, for example the free object over the set of ADT operations. The interface of the ADT typically refers only to the domain and operations, and perhaps some of the constraints on the operations, such as pre-conditions and post-conditions; but not to other constraints, such as relations between the operations, which are considered behavior. There are two main styles of formal specifications for behavior, axiomatic semantics and operational semantics.[7]

Despite not being part of the interface, the constraints are still important to the definition of the ADT; for example a stack and a queue have similar add element/remove element interfaces, but it is the constraints that distinguish last-in-first-out from first-in-first-out behavior. The constraints do not consist only of equations such as fetch(store(S,v))=v but also logical formulas.

Operational semantics

edit

In the spirit of imperative programming, an abstract data structure is conceived as an entity that is mutable—meaning that there is a notion of time and the ADT may be in different states at different times. Operations then change the state of the ADT over time; therefore, the order in which operations are evaluated is important, and the same operation on the same entities may have different effects if executed at different times. This is analogous to the instructions of a computer or the commands and procedures of an imperative language. To underscore this view, it is customary to say that the operations are executed or applied, rather than evaluated, similar to the imperative style often used when describing abstract algorithms. The constraints are typically specified in prose.

Auxiliary operations

edit

Presentations of ADTs are often limited in scope to only key operations. More thorough presentations often specify auxiliary operations on ADTs, such as:

  • create(), that yields a new instance of the ADT;
  • compare(s, t), that tests whether two instances' states are equivalent in some sense;
  • hash(s), that computes some standard hash function from the instance's state;
  • print(s) or show(s), that produces a human-readable representation of the instance's state.

These names are illustrative and may vary between authors. In imperative-style ADT definitions, one often finds also:

  • initialize(s), that prepares a newly created instance s for further operations, or resets it to some "initial state";
  • copy(s, t), that puts instance s in a state equivalent to that of t;
  • clone(t), that performs screate(), copy(s, t), and returns s;
  • free(s) or destroy(s), that reclaims the memory and other resources used by s.

The free operation is not normally relevant or meaningful, since ADTs are theoretical entities that do not "use memory". However, it may be necessary when one needs to analyze the storage used by an algorithm that uses the ADT. In that case, one needs additional axioms that specify how much memory each ADT instance uses, as a function of its state, and how much of it is returned to the pool by free.

Restricted types

edit

The definition of an ADT often restricts the stored value(s) for its instances, to members of a specific set X called the range of those variables. For example, an abstract variable may be constrained to only store integers. As in programming languages, such restrictions may simplify the description and analysis of algorithms, and improve its readability.

Aliasing

edit

In the operational style, it is often unclear how multiple instances are handled and if modifying one instance may affect others. A common style of defining ADTs writes the operations as if only one instance exists during the execution of the algorithm, and all operations are applied to that instance. For example, a stack may have operations push(x) and pop(), that operate on the only existing stack. ADT definitions in this style can be easily rewritten to admit multiple coexisting instances of the ADT, by adding an explicit instance parameter (like S in the stack example below) to every operation that uses or modifies the implicit instance. Some ADTs cannot be meaningfully defined without allowing multiple instances, for example when a single operation takes two distinct instances of the ADT as parameters, such as a union operation on sets or a compare operation on lists.

The multiple instance style is sometimes combined with an aliasing axiom, namely that the result of create() is distinct from any instance already in use by the algorithm. Implementations of ADTs may still reuse memory and allow implementations of create() to yield a previously created instance; however, defining that such an instance even is "reused" is difficult in the ADT formalism.

More generally, this axiom may be strengthened to exclude also partial aliasing with other instances, so that composite ADTs (such as trees or records) and reference-style ADTs (such as pointers) may be assumed to be completely disjoint. For example, when extending the definition of an abstract variable to include abstract records, operations upon a field F of a record variable R, clearly involve F, which is distinct from, but also a part of, R. A partial aliasing axiom would state that changing a field of one record variable does not affect any other records.

Complexity analysis

edit

Some authors also include the computational complexity ("cost") of each operation, both in terms of time (for computing operations) and space (for representing values), to aid in analysis of algorithms. For example, one may specify that each operation takes the same time and each value takes the same space regardless of the state of the ADT, or that there is a "size" of the ADT and the operations are linear, quadratic, etc. in the size of the ADT. Alexander Stepanov, designer of the C++ Standard Template Library, included complexity guarantees in the STL specification, arguing:

The reason for introducing the notion of abstract data types was to allow interchangeable software modules. You cannot have interchangeable modules unless these modules share similar complexity behavior. If I replace one module with another module with the same functional behavior but with different complexity tradeoffs, the user of this code will be unpleasantly surprised. I could tell him anything I like about data abstraction, and he still would not want to use the code. Complexity assertions have to be part of the interface.

—?Alexander Stepanov[8]

Other authors disagree, arguing that a stack ADT is the same whether it is implemented with a linked list or an array, despite the difference in operation costs, and that an ADT specification should be independent of implementation.

Examples

edit

Abstract variable

edit

An abstract variable may be regarded as the simplest non-trivial ADT, with the semantics of an imperative variable. It admits two operations, fetch and store. Operational definitions are often written in terms of abstract variables. In the axiomatic semantics, letting   be the type of the abstract variable and   be the type of its contents, fetch is a function   and store is a function of type  . The main constraint is that fetch always returns the value x used in the most recent store operation on the same variable V, i.e. fetch(store(V,x)) = x. We may also require that store overwrites the value fully, store(store(V,x1),x2) = store(V,x2).

In the operational semantics, fetch(V) is a procedure that returns the current value in the location V, and store(V, x) is a procedure with void return type that stores the value x in the location V. The constraints are described informally as that reads are consistent with writes. As in many programming languages, the operation store(V, x) is often written Vx (or some similar notation), and fetch(V) is implied whenever a variable V is used in a context where a value is required. Thus, for example, VV + 1 is commonly understood to be a shorthand for store(V,fetch(V) + 1).

In this definition, it is implicitly assumed that names are always distinct: storing a value into a variable U has no effect on the state of a distinct variable V. To make this assumption explicit, one could add the constraint that:

  • if U and V are distinct variables, the sequence { store(U, x); store(V, y) } is equivalent to { store(V, y); store(U, x) }.

This definition does not say anything about the result of evaluating fetch(V) when V is un-initialized, that is, before performing any store operation on V. Fetching before storing can be disallowed, defined to have a certain result, or left unspecified. There are some algorithms whose efficiency depends on the assumption that such a fetch is legal, and returns some arbitrary value in the variable's range.

Abstract stack

edit

An abstract stack is a last-in-first-out structure, It is generally defined by three key operations: push, that inserts a data item onto the stack; pop, that removes a data item from it; and peek or top, that accesses a data item on top of the stack without removal. A complete abstract stack definition includes also a Boolean-valued function empty(S) and a create() operation that returns an initial stack instance.

In the axiomatic semantics, letting   be the type of stack states and   be the type of values contained in the stack, these could have the types  ,  ,  ,  , and  . In the axiomatic semantics, creating the initial stack is a "trivial" operation, and always returns the same distinguished state. Therefore, it is often designated by a special symbol like Λ or "()". The empty operation predicate can then be written simply as   or  .

The constraints are then pop(push(S,v))=(S,v), top(push(S,v))=v,[9] empty(create) = T (a newly created stack is empty), empty(push(S, x)) = F (pushing something into a stack makes it non-empty). These axioms do not define the effect of top(s) or pop(s), unless s is a stack state returned by a push. Since push leaves the stack non-empty, those two operations can be defined to be invalid when s = Λ. From these axioms (and the lack of side effects), it can be deduced that push(Λ, x) ≠ Λ. Also, push(s, x) = push(t, y) if and only if x = y and s = t.

As in some other branches of mathematics, it is customary to assume also that the stack states are only those whose existence can be proved from the axioms in a finite number of steps. In this case, it means that every stack is a finite sequence of values, that becomes the empty stack (Λ) after a finite number of pops. By themselves, the axioms above do not exclude the existence of infinite stacks (that can be popped forever, each time yielding a different state) or circular stacks (that return to the same state after a finite number of pops). In particular, they do not exclude states s such that pop(s) = s or push(s, x) = s for some x. However, since one cannot obtain such stack states from the initial stack state with the given operations, they are assumed "not to exist".

In the operational definition of an abstract stack, push(S, x) returns nothing and pop(S) yields the value as the result but not the new state of the stack. There is then the constraint that, for any value x and any abstract variable V, the sequence of operations { push(S, x); Vpop(S) } is equivalent to Vx. Since the assignment Vx, by definition, cannot change the state of S, this condition implies that Vpop(S) restores S to the state it had before the push(S, x). From this condition and from the properties of abstract variables, it follows, for example, that the sequence:

{ push(S, x); push(S, y); Upop(S); push(S, z); Vpop(S); Wpop(S) }

where x, y, and z are any values, and U, V, W are pairwise distinct variables, is equivalent to:

{ Uy; Vz; Wx }

Unlike the axiomatic semantics, the operational semantics can suffer from aliasing. Here it is implicitly assumed that operations on a stack instance do not modify the state of any other ADT instance, including other stacks; that is:

  • For any values x, y, and any distinct stacks S and T, the sequence { push(S, x); push(T, y) } is equivalent to { push(T, y); push(S, x) }.

Boom hierarchy

edit

A more involved example is the Boom hierarchy of the binary tree, list, bag and set abstract data types.[10] All these data types can be declared by three operations: null, which constructs the empty container, single, which constructs a container from a single element and append, which combines two containers of the same type. The complete specification for the four data types can then be given by successively adding the following rules over these operations:

null is the left and right neutral for a tree append(null,A) = A, append(A,null) = A.
lists add that append is associative append(append(A,B),C) = append(A,append(B,C)).
bags add commutativit append(B,A) = append(A,B).
finally, sets are also idempotent append(A,A) = A.

Access to the data can be specified by pattern-matching over the three operations, e.g. a member function for these containers by:

member(X,single(Y)) = eq(X,Y)
member(X,null) = false
member(X,append(A,B)) = or(member(X,A), member(X,B))

Care must be taken to ensure that the function is invariant under the relevant rules for the data type. Within each of the equivalence classes implied by the chosen subset of equations, it has to yield the same result for all of its members.

Common ADTs

edit

Some common ADTs, which have proved useful in a great variety of applications, are

Each of these ADTs may be defined in many ways and variants, not necessarily equivalent. For example, an abstract stack may or may not have a count operation that tells how many items have been pushed and not yet popped. This choice makes a difference not only for its clients but also for the implementation.

Abstract graphical data type

An extension of ADT for computer graphics was proposed in 1979:[11] an abstract graphical data type (AGDT). It was introduced by Nadia Magnenat Thalmann, and Daniel Thalmann. AGDTs provide the advantages of ADTs with facilities to build graphical objects in a structured way.

Implementation

edit

Abstract data types are theoretical entities, used (among other things) to simplify the description of abstract algorithms, to classify and evaluate data structures, and to formally describe the type systems of programming languages. However, an ADT may be implemented. This means each ADT instance or state is represented by some of the concrete data type or data structure, and for each abstract operation there is a corresponding procedure or function, and these implemented procedures satisfy the ADT's specifications and axioms up to some standard. In practice, the implementation is not perfect, and users must be aware of issues due to limitations of the representation and implemented procedures.

For example, integers may be specified as an ADT, defined by the distinguished values 0 and 1, the operations of addition, subtraction, multiplication, division (with care for division by zero), comparison, etc., behaving according to the familiar mathematical axioms in abstract algebra such as associativity, commutativity, and so on. However, in a computer, integers are most commonly represented as fixed-width 32-bit or 64-bit binary numbers. Users must be aware of issues with this representation, such as arithmetic overflow, where the ADT specifies a valid result but the representation is unable to accommodate this value. Nonetheless, for many purposes, the user can ignore these infidelities and simply use the implementation as if it were the abstract data type.

Usually, there are many ways to implement the same ADT, using several different concrete data structures. Thus, for example, an abstract stack can be implemented by a linked list or by an array. Different implementations of the ADT, having all the same properties and abilities, can be considered semantically equivalent and may be used somewhat interchangeably in code that uses the ADT. This provides a form of abstraction or encapsulation, and gives a great deal of flexibility when using ADT objects in different situations. For example, different implementations of the ADT may be more efficient in different situations; it is possible to use each in the situation where they are preferable, thus increasing overall efficiency. Code that uses an ADT implementation according to its interface will continue working even if the implementation of the ADT is changed.

In order to prevent clients from depending on the implementation, an ADT is often packaged as an opaque data type or handle of some sort,[12] in one or more modules, whose interface contains only the signature (number and types of the parameters and results) of the operations. The implementation of the module—namely, the bodies of the procedures and the concrete data structure used—can then be hidden from most clients of the module. This makes it possible to change the implementation without affecting the clients. If the implementation is exposed, it is known instead as a transparent data type.

Modern object-oriented languages, such as C++ and Java, support a form of abstract data types. When a class is used as a type, it is an abstract type that refers to a hidden representation. In this model, an ADT is typically implemented as a class, and each instance of the ADT is usually an object of that class. The module's interface typically declares the constructors as ordinary procedures, and most of the other ADT operations as methods of that class. Many modern programming languages, such as C++ and Java, come with standard libraries that implement numerous ADTs in this style. However, such an approach does not easily encapsulate multiple representational variants found in an ADT. It also can undermine the extensibility of object-oriented programs. In a pure object-oriented program that uses interfaces as types, types refer to behaviours, not representations.

The specification of some programming languages is intentionally vague about the representation of certain built-in data types, defining only the operations that can be done on them. Therefore, those types can be viewed as "built-in ADTs". Examples are the arrays in many scripting languages, such as Awk, Lua, and Perl, which can be regarded as an implementation of the abstract list.

In a formal specification language, ADTs may be defined axiomatically, and the language then allows manipulating values of these ADTs, thus providing a straightforward and immediate implementation. The OBJ family of programming languages for instance allows defining equations for specification and rewriting to run them. Such automatic implementations are usually not as efficient as dedicated implementations, however.

Example: implementation of the abstract stack

edit

As an example, here is an implementation of the abstract stack above in the C programming language.

Imperative-style interface

edit

An imperative-style interface might be:

typedef struct stack_Rep stack_Rep;       // type: stack instance representation (opaque record)
typedef stack_Rep* stack_T;               // type: handle to a stack instance (opaque pointer)
typedef void* stack_Item;                 // type: value stored in stack instance (arbitrary address)

stack_T stack_create(void);               // creates a new empty stack instance
void stack_push(stack_T s, stack_Item x); // adds an item at the top of the stack
stack_Item stack_pop(stack_T s);          // removes the top item from the stack and returns it
bool stack_empty(stack_T s);              // checks whether stack is empty

This interface could be used in the following manner:

#include <stack.h>          // includes the stack interface

stack_T s = stack_create(); // creates a new empty stack instance
int x = 17;
stack_push(s, &x);          // adds the address of x at the top of the stack
void* y = stack_pop(s);     // removes the address of x from the stack and returns it
if (stack_empty(s)) { }     // does something if stack is empty

This interface can be implemented in many ways. The implementation may be arbitrarily inefficient, since the formal definition of the ADT, above, does not specify how much space the stack may use, nor how long each operation should take. It also does not specify whether the stack state s continues to exist after a call xpop(s).

In practice the formal definition should specify that the space is proportional to the number of items pushed and not yet popped; and that every one of the operations above must finish in a constant amount of time, independently of that number. To comply with these additional specifications, the implementation could use a linked list, or an array (with dynamic resizing) together with two integers (an item count and the array size).

Functional-style interface

edit

Functional-style ADT definitions are more appropriate for functional programming languages, and vice versa. However, one can provide a functional-style interface even in an imperative language like C. For example:

typedef struct stack_Rep stack_Rep;          // type: stack state representation (opaque record)
typedef stack_Rep* stack_T;                  // type: handle to a stack state (opaque pointer)
typedef void* stack_Item;                    // type: value of a stack state (arbitrary address)

stack_T stack_empty(void);                   // returns the empty stack state
stack_T stack_push(stack_T s, stack_Item x); // adds an item at the top of the stack state and returns the resulting stack state
stack_T stack_pop(stack_T s);                // removes the top item from the stack state and returns the resulting stack state
stack_Item stack_top(stack_T s);             // returns the top item of the stack state

See also

edit

Notes

edit

Citations

edit
  1. ^ "Reading 10: Abstract Data Types". MIT.
  2. ^ Liskov & Zilles 1974.
  3. ^ Ehrig, H. (1985). Fundamentals of Algebraic Specification 1 - Equations and Initial Semantics. Springer-Verlag. ISBN 0-387-13718-1.
  4. ^ Wechler, Wolfgang (1992). Universal Algebra for Computer Scientists. Springer-Verlag. ISBN 0-387-54280-9.
  5. ^ Rudolf Lidl (2004). Abstract Algebra. Springer. ISBN 978-81-8128-149-4., Chapter 7, section 40.
  6. ^ Dale & Walker 1996, p. 3.
  7. ^ Dale & Walker 1996, p. 4.
  8. ^ Stevens, Al (March 1995). "Al Stevens Interviews Alex Stepanov". Dr. Dobb's Journal. Retrieved 31 January 2015.
  9. ^ Black, Paul E. (24 August 2005). "axiomatic semantics". Dictionary of Algorithms and Data Structures. Retrieved 25 November 2023.
  10. ^ Bunkenburg, Alexander (1994). "The Boom Hierarchy". Functional Programming, Glasgow 1993. Workshops in Computing. pp. 1–8. CiteSeerX 10.1.1.49.3252. doi:10.1007/978-1-4471-3236-3_1. ISBN 978-3-540-19879-6.
  11. ^ D. Thalmann, N. Magnenat Thalmann (1979). Design and Implementation of Abstract Graphical Data Types. IEEE. doi:10.1109/CMPSAC.1979.762551., Proc. 3rd International Computer Software and Applications Conference (COMPSAC'79), IEEE, Chicago, USA, pp.519-524
  12. ^ Robert Sedgewick (1998). Algorithms in C. Addison/Wesley. ISBN 978-0-201-31452-6., definition 4.4.

References

edit

Further reading

edit
edit
顶格是什么意思 什么是规培 做肠镜挂什么科 一个口一个且念什么字 2月27号是什么星座
上海是什么中心 银装素裹是什么意思 吃什么降血脂最快最好 昧是什么意思 什么饮料能解酒
抗生素是什么 狮子座后面是什么星座 为什么会得干眼症 心病是什么意思 膝盖痛吃什么
成人达己是什么意思 为什么会放屁 车厘子是什么季节的 耳闷耳堵是什么原因引起的 义诊是什么意思
左克是什么药hcv9jop4ns5r.cn 蜘蛛吃什么食物hcv9jop6ns4r.cn 不解什么什么hcv8jop3ns0r.cn 舌苔白厚腻吃什么药见效快hcv9jop2ns8r.cn 才思敏捷是什么意思hcv8jop3ns9r.cn
为什么不爱我hcv9jop0ns6r.cn 腿硬邦邦的是什么原因hcv8jop8ns4r.cn 耳鸣需要做什么检查hcv9jop4ns6r.cn 爱出汗挂什么科hcv8jop1ns4r.cn 凉皮用什么面粉hcv8jop5ns9r.cn
2.5什么星座jingluanji.com 吃什么食物可以降尿酸hcv9jop6ns9r.cn 胸闷是什么感觉hcv8jop4ns0r.cn 脂肪肝应注意什么hcv9jop6ns0r.cn 咽口水喉咙痛吃什么药imcecn.com
腿浮肿是什么原因hcv9jop1ns1r.cn 牙齿松动吃什么药hcv9jop0ns9r.cn 碱和小苏打有什么区别hcv8jop5ns6r.cn complete是什么意思hcv9jop4ns9r.cn 凌晨三点是什么时辰hcv9jop0ns7r.cn
百度