任一表达式都可看成是由操作数,运算符和界限符组成的 一个串。其中,操作数可以是常数也可以是变量或常量的标识 符,运算符可以是算术运算符,关系运算符和逻辑运算符等,界限符包括左右括号和表达式结束符等,例表达式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);}
了解以上基本简单运算即可,具体事例可以是计算一个数学公式即可,根据计算优先级依次用栈实现,详细代码这里不列入。
以上,了解数据结构语法~