数据结构-栈和队列

任一表达式都可看成是由操作数,运算符和界限符组成的 一个串。其中,操作数可以是常数也可以是变量或常量的标识 符,运算符可以是算术运算符,关系运算符和逻辑运算符等,界限符包括左右括号和表达式结束符等,例表达式7+4*(8-3)。 计算机要完成表达式的求值,必须正确的解释表达式,将其翻译成正确的机器指令序列。要了解计算机的求值过程,必须先研究栈的性质。

1 栈的定义和基本运算

栈是限定只能在表尾进行插入和删除的线性表,并将表尾 称为栈顶,表头称为栈底。给出了非空栈s=(A,B,C,D)的示意图。

由于限定只能在栈顶进行操作,所以栈中元素必按A,B,C,D 次序进栈,,按D,C,B,A次序出栈,即按"后进先出"(或“先进后出") 的原则进行操作的。这一特点可用生活中的实例形象说明。例如每次只能容一个人进出的死胡同就相当一个栈,胡同口相当于栈顶,而胡同的另一端则为栈底。

栈的基本运算

(1)判栈空Empty(S). 若栈为空则返回“真“,否则返回”假“;

(2)入栈操作(压栈)Push(S,x) 将新元素压入栈中,使其成为栈顶元素;

(3)出栈操作(弹栈)Pop(S,x) 若栈不空则返回栈顶元素,并从栈中删除栈顶元素,否则返回NULL;

(4)取栈顶元素 Pettop(s,x) 若栈不空则返回栈顶元素,否则返回NULL;

(5)置空栈Clear(s) 将当前栈设定为空栈;

(6)求元素个数currentsize(s)求当前栈中元素的个数。

2顺序栈的存储结构及算法实现

顺序栈利用一组连续的存储单元存放从栈底到栈顶的诸元素。同时用一指针top指示当前栈顶元素的位置,C语言中用一维数组来描述。

#define maxsize N typedef struct

{Datatype data[maxsize+1]; int top; }Stack;

顺序栈的基本运算的实现

判栈空,置空栈,求元素个数算法容易实现,只要判断或改变s.top的值即可。下面仅给出进栈,出栈,取栈顶元素等函 数的算法实现。

压栈

2.1

/*算法描述2-1*/

int Push(Stack S, Datatype x)

{if (S.top==maxsize) {printf("overflow\n"); return(0);}

S.data[++S.top]=x; return(1);

2.2 出栈

/*算法描述2-2*/

int Pop(Stack s, Datatype x) {if(S.top==0){printf("nudertflow\n");return(0)};

x=S.data[S.top]; S.top--; return(1);

}

2.3 取栈顶元素

/*算法描述2-3*/

int Gettop(Stack S, Datatype x) {if(S.top==0){printf("nodata\N");return(0);}

x=S.data[top]; return(1); }

3 队列

队列的定义和运算

和栈相反,队列是一种“先进先出”的线性表。他只允许再表的一端(称表尾)插入元素,在表的另一端(表头)删除元素。队列和日常生活中的排队是一致的,最早进入队列的元素最早得到服务。

给出可队列示意图。

队列的操作与栈的操作类似,不同的是删除运算是在表头进行。

(1)判队空 EmptyQueue(Q) 若队列为空则返回“真“,否则返 回”假“;

入队将新元素插入到队尾。

(2) InQueue(Q,x) x ;

(3)出队OutQueue(Q,x) 若队列不空则返回队首的第一个元素元素,并从队列中删除该元素,否则返回NULL;

(4)置空队列InitQueue(Q) 将当队列设定为空队列;

(5)求元素个数 CurrentSize(Q) 返回当前队列中元素的个数 。

队列的存储结构及其算法实现

和栈类似,队列的顺序存储结构用一个向量来存储队列中 的元素,不过还需两个指针来指示队头元素和对尾元素在队列 中的当前位置。C语言描述如下:

# define maxsize N

typedef stuct

{Datatype adta[maxsize+1];

int front, rear; } Queue;

3.1 顺序队列的基本运算

(1)判队空

/*算法描述3-1*/

int EmptyQueue(Queue Q)

{if (Q.front==Q.rear) return(1); else return(0);}

3.2

入队 /*算法描述3.2*/

int InQueue(Queue Q, Datatype x)

{if (Q.rear==maxsize) {printf("overflow!"); return(0);}

Q.rear++;

Q.data[Q.rear]=x; return(1);}

3.3 出队

/*算法描述3-3*/

int OutQueue(Queue Q, Datatype x) {if(EmptyQueue(Q)){printf("underflow!"); return(0);}

x=Q.data[Q.front+1];

Q.front++; if(EmptyQueue(Q)){Q.front=0; Q.rear=0} return(1);}

了解以上基本简单运算即可,具体事例可以是计算一个数学公式即可,根据计算优先级依次用栈实现,详细代码这里不列入。

以上,了解数据结构语法~

推荐阅读更多精彩内容

  • 1. 栈 Stack 定义:限定仅在表尾进行插入和删除操作的线性表。即后进先出的线性表(Last In First...
    Lost_Robot阅读 967评论 0 1
  • 一、队列的定义 【定义】:队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。【特征】:...
    JsutFunGuy阅读 199评论 0 3
  • 栈的定义 栈实际上也是线性表,只不过是一种特殊的线性表。其特殊性在于栈的基本操作是线性表操作的子集,他们的操作受限...
    JsutFunGuy阅读 638评论 0 6
  • 该系列文章主要作数据结构(C语言版)学习的笔记。里面代码的注释很详细,同时提供给大家参考,欢迎指正和指教。 栈的链...
    JsutFunGuy阅读 2,332评论 5 7
  • 爱❤️似乎领略到我们皆为一杯地球汤里的一小部分,而地球又是更大地宇宙汤里的一小部分。因此,爱就是觉知这份美并拥有充...
    Be_Jessica阅读 1,053评论 0 3