优点:
缺点:
优点:
缺点:
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
允许插入和删除运算的一端称为栈顶(top),不允许插入和删除的另一端称为栈底(bottom)。
在栈顶进行的插入操作称为入栈或进栈(push),在栈顶进行的删除操作称为出栈或退栈(pop)
特点:后进先出(LIFO, Last In First Out)。
InitStack(&s):初始化栈。构造一个空栈s。
DestroyStack(&s):销毁栈。释放栈s占用的存储空间。
StackEmpty(s):判断栈是否为空:若栈s为空,则返回真;否则返回假。
Push(&S,e):进栈。将元素e插入到栈s中作为栈顶元素。
Pop(&s,&e):出栈。从栈s中退出栈顶元素,并将其值赋给e。
GetTop(s,&e):取栈顶元素。返回当前的栈顶元素,并将其值赋给e。
#define MaxSize 100 // 定义常量MaxSize为100,作为栈的最大容量 // 定义ElemType类型,这里假设ElemType是某种基本数据类型,比如int typedef int ElemType; // 定义顺序栈的结构体 typedef struct { ElemType data[MaxSize]; // 一个数组,用于存储栈中的元素,大小为MaxSize int top; // 一个整型变量,用于指向栈顶元素的索引 } SqStack; // 用typedef为这个结构体定义一个新的类型名SqStack,代表顺序栈
MaxSize为顺序栈的最大容量;
top为栈顶元素的下标,0 <= top <= MaxSize-1
栈空:top = -1;
栈满:top = MaxSize-1
②栈顶下标增一,指向新的栈顶位置;
③将新元素置于栈顶。
bool Push(SqStack &S, ElemType item) { if (S.top == MaxSize - 1) { cout << "栈满" << endl; return false; } S.top++; S.data[S.top] = item; return true; }
操作步骤:
①判断栈是否为空,若空则产生下溢出错误,退出算法,否则执行第②步;
②栈顶元素出栈;
③栈顶下标减一,指向新的栈顶位置;
bool Pop(SqStack &S, ElemType &item) { if (S.top == -1) { cout << "栈空" << endl; return false; } item = S.data[S.top]; S.top--; return true; }
typedef struct LNode { ElemType data; //数据域 struct LNode *next; //后继结点指针 } LinkStNode; //链栈结点类型
bool Push(LinkStNode *S, ElemType item) { //带头结点单链表的表头插入法 LinkStNode *t = new LinkStNode; //①生成新结点 if (t == NULL) { cout << "内存不足"; return false; } t->data = item; //②在栈顶插入新结点 t->next = S->next; S->next = t; //③ return true; }
bool Pop(LinkStNode *S, ElemType &item) { //删除单链表的第一个元素结点 //①判断栈是否为空 if (S->next == NULL) { cout << "栈空"; return false; } //②删除栈顶元素 LinkStNode *t = S->next; S->next = t->next; item = t->data; delete t; return true; }
void Convert(int num, int d) { //num为待转换数,d为进制 SqStack S; ElemType result; int r; //余数 char ch[] = "0123456789ABCDEF"; //进制所使用的字符 InitStack(S); while (num != 0) { r = num % d; //取余数r Push(S, ch[r]); //余数入栈 num = num / d; //利用商进行下一次运算 } while (!StackEmpty(S)) { Pop(S, result); cout << result; } }
算术表达式的定义:任何一个表达式都是由操作数、运算符和界限符组成。
算术表达式的三种形式:前缀、中缀、后缀。
中缀表达式的运算规则和特点。
后缀表达式的特点与运算规则。
用到的数据结构:
char数组 str1:存放中缀表达式,以 # 结尾;
char数组 str2:存放转换后的后缀表达式;
char型栈 S:存放运算符,包括 * / + - ( #
其中,* / 优先级设为2,
+ - 优先级设为1,
为处理方便,将 ( 优先级设为3,# 优先级设为0
while(str1[i] != ‘\0’)