#include "iostream" using namespace std; //=====================栈(后进先出)==================== /*栈也是线性表,限定在栈顶进行插入&删除,时间复杂度均为O(1) 栈:最大存储大小+数据*/ //=================栈的顺序存储================== const int MAXSIZE = 20; //栈的数据结构: struct Sqstack { int data[20]; int top; Sqstack(int x) :top(x){}; }; /*栈的遍历:*/ bool StackVisit(const Sqstack *S) { if (S->top == -1) return false; else { for (int i = 0; i <= S->top; i++) cout << S->data[i] << " "; cout << endl; return true; } } /*进栈操作push: 1.栈顶指针 S->top 先自增1,给需要进栈的元素腾出内存空间。 2.再赋值。就是给对应的数组元素赋值:S->data[S->top]=e */ bool myPush(Sqstack *S, int elem) { if (S->top == MAXSIZE - 1) { cout << "栈已满!" << endl; return false; } else { S->top++; S->data[S->top] = elem; return true; } } /*出栈操作pop: 先把要出栈的元素获取到,然后再指针自减,把空间释放出来。 */ bool MyPop(Sqstack *S) { if (S->top == -1) { cout << "空栈!" << endl; return false; } else { S->top--; return true; } } /*获取顺序栈的栈顶元素:*/ bool GetTop(Sqstack *S, int &elem) { if (S->top == -1) { cout << "空栈!" << endl; return false; } else { elem = S->data[S->top]; return true; } } //判断是否为空栈 bool StackEmpty(Sqstack *S) { if (S->top == -1) return true; else return false; } //置空栈 bool ClearStack(Sqstack *S) { S->top = -1; return true; } //两栈共享空间 //======================================= //=============栈的链式存储============ /*链栈也是一种单链表,栈顶指针即为单链表头指针,不需要头结点,不存在慢栈情况。空栈即top==NULL 链栈:top指针+节点(数据)*/ struct StackNode //链栈节点 { int val; StackNode *next; StackNode(int x) :val(x), next(NULL){}; }; typedef struct LinkStack //头结点 { StackNode *top; int count;//记录栈中元素个数 }; LinkStack* InitLinkStack() { LinkStack *p = new LinkStack; p->count = 0; p->top = NULL; return p; } //链栈的进栈操作Push /*1.处理新结点s的后继,这个后继就是原本的栈顶结点。 2.将栈顶指针 top 重新指向新结点s就行了。 */ bool myLinkPush(LinkStack *S, int data) { StackNode *p = new StackNode(data); p->next = S->top; S->top = p; S->count++; return true; } //链栈的出栈操作Pop: /*1.首先设定一个工作结点 p,并且将栈顶结点赋值给它。 2.然后将栈顶指针下移一位,指向下一结点。代码表示为 S->top=S->top->next; 3.最后把结点 p delete掉,count--。*/ bool myLinkPop(LinkStack *S) { if (S->top == NULL) { cout << "空栈!" << endl; return false; } else { StackNode *p = S->top; S->top = S->top->next; delete p; return true; } } //链栈的遍历: bool VisitLinkStack(LinkStack *S) { if (S->top==NULL) { cout << "空栈!" << endl; return false; } else { StackNode *p = S->top; while (p != NULL) { cout << p->val << " "; p = p->next; } cout << endl; return true; } } //判断链栈是否为空 bool LinkStackEmpty(LinkStack *S) { if (S->count == 0) return true; else return false; } //链栈置空:方法是设置两个工作结点,开始循环。在释放p之前,让q成为p的后继。 bool ClearLinkStack(LinkStack *S) { if (S->top == NULL) return true; else{ StackNode *p, *q; p = S->top; while (p) { q = p; p = p->next; delete q; } S->count = 0; S->top = NULL; return true; } } //============================================= //递归:定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出 //斐波那契的递归函数 int Fbi(int i) { if (i < 2) return i == 0 ? 0 : 1; else return Fbi(i - 1) + Fbi(i - 2); } //将中缀表达式转化为后缀表达式: /*从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分; 若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出, 并将当前符号进栈,一直到最终输出后缀表达式为止*/ int main() { //==============栈的顺序存储=========== // Sqstack *S = new Sqstack(-1); // int n = 0; // while (cin >> n) // myPush(S, n); // // MyPop(S); // StackVisit(S); //============链栈=================== LinkStack *S = InitLinkStack(); int n; while (cin>>n) myLinkPush(S, n); //myLinkPop(S); ClearLinkStack(S); VisitLinkStack(S); system("pause"); return 0; }
(链)栈的基本操作 C++
猜你喜欢
转载自blog.csdn.net/cat1992/article/details/75451187
今日推荐
周排行