说实话,在栈中加一个取栈顶元素会更友好
default
类模板
运算符重载
出栈传入的是引用的好处:
使用这个函数的时候,传入参数可以是一个变量,这个变量可以把传给他的值取出
执行入栈操作,把元素存入栈顶,栈顶指针++以后指向了一个空位置(下一个元素要入栈的位置)所以入栈先复制再++操作
入栈操作后做出栈操作,要先把栈顶指针--指向有元素的位置,再把栈顶元素赋值给变量 ,达到了栈高度度下降,并且返回了一个值
修改后:
#include <iostream> #include <stdlib.h> #include "MyStack.h" #include <algorithm> #include <string> using namespace std; //用栈进行括号匹配 int main(void) { //定义两个栈 MyStack *pStack = new MyStack(30);//用于存放输入字符串的字符 MyStack *pNeedStack = new MyStack(30);//用于存放栈顶急需匹配的字符 char str[] = "[()]"; char currentNeed = 0; for(int i = 0; i < strlen(str);i++) { if(str[i] != currentNeed) { pStack->push(str[i]); switch(str[i]) { case'[': if(currentNeed != 0)//currentNeed有一个正确的值 { pNeedStack->push(currentNeed); } currentNeed = ']'; break; case '(': if(currentNeed != 0) { pNeedStack->push(currentNeed); } currentNeed = ')'; break; default: cout<<"字符串括号匹配"<<endl; return 0; } } else { char elem; pStack->pop(elem); if(pNeedStack->pop(currentNeed)) { currentNeed = 0; } } } if(pStack->stackEmpty()) { cout<<"字符串括号匹配"<<endl; } else { cout<<"字符串括号不匹配"<<endl; } delete pStack; pStack = NULL; delete pNeedStack; pNeedStack = NULL; return 0; }
还是有点不太理解,自己做
#include <iostream> #include <stdlib.h> #include "MyStack.h" #include <algorithm> #include <string> using namespace std; //用栈进行括号匹配 int main(void) { //定义两个栈 MyStack *pStack = new MyStack(30);//用于存放输入字符串的字符 MyStack *pNeedStack = new MyStack(30);//用于存放栈顶急需匹配的字符 char str[] = "[()]"; char currentNeed = 0; for(int i = 0; i < strlen(str);i++) { if(str[i] != currentNeed) { pStack->push(str[i]); switch(str[i]) { case'[': if(currentNeed != 0)//currentNeed有一个正确的值 { pNeedStack->push(currentNeed); } currentNeed = ']'; break; case '(': if(currentNeed != 0) { pNeedStack->push(currentNeed); } currentNeed = ')'; break; } } else { char elem; pStack->pop(elem); pNeedStack->pop(currentNeed); } } if(pStack->stackEmpty()) { cout<<"字符串括号匹配"<<endl; } else { cout<<"字符串括号不匹配"<<endl; } delete pStack; pStack = NULL; delete pNeedStack; pNeedStack = NULL; return 0; }
老师是把余数10,11,12,13直接压进栈的,感觉直接压A、B、C、D方便很多。
老师的方法暂未看。
上一个程序不完善,因为有16进制。
https://www.cnblogs.com/curo0119/p/8304924.html
自己修改:应该正确:
#include <iostream> #include <stdlib.h> #include "MyStack.h" #include <algorithm> #include <string> using namespace std; //用栈进行进制转换 #define BIN 2 #define OCT 8 #define HEX 16 int main(void) { string str = "0123456789ABCDEF"; MyStack *pStack = new MyStack(30); int N = 12; while(N) { int tmp = N % HEX; pStack->push(str[tmp]); N /= HEX; } pStack->stackTraverse(false); delete pStack; pStack = NULL; return 0; }
首先把之前的MyStack改成int型:
#include <iostream> #include <stdlib.h> #include "MyStack.h" #include <algorithm> using namespace std; //用栈进行进制转换 #define BIN 2 #define OCT 8 #define HEX 16 int main(void) { MyStack *pStack = new MyStack(30); int N = 1348; while(N) { int tmp = N % OCT; pStack->push(tmp); N /= OCT; } pStack->stackTraverse(false); delete pStack; pStack = NULL; return 0; }
没做笔记。。
main.cpp #include <iostream> #include <stdlib.h> #include "MyStack.h" using namespace std; //实现栈 int main(void) { MyStack *pStack = new MyStack(5); pStack->push('h'); pStack->push('e'); pStack->push('l'); pStack->push('l'); pStack->push('o'); pStack->stackTraverse(true); pStack->clearStack(); cout<<pStack->stackLength()<<endl; if(pStack->stackEmpty()) { cout << "栈为空" << endl; } delete pStack; pStack = NULL; return 0; }
MyStack.cpp // #include "MyStack.h" #include <iostream> using namespace std; MyStack::MyStack(int size)//分配内存初始化栈空间,设定栈容量,栈顶 { m_iSize = size; m_pBuffer = new char[size]; m_iTop = 0;//表示此时的栈是个空栈 } MyStack::~MyStack() { delete []m_pBuffer; } bool MyStack::stackEmpty()//判定栈是否为空,为空返回true,非空返回false { if(0 == m_iTop) { return true; } return false; } bool MyStack::stackFull() { if(m_iTop == m_iSize) { return true; } return false; } void MyStack::clearStack()//清空栈 { m_iTop = 0; } int MyStack::stackLength()//已有元素的个数 { return m_iTop; } bool MyStack::push(char elem)//元素入栈,栈顶上升 { //先判断是否栈满 if(stackFull()) { return false; } m_pBuffer[m_iTop] = elem; m_iTop++; return true; } //法二 //char MyStack::pop() //{ // if(stackEmpty()) // { // throw 1; // } // else // { // m_iTop--; // return m_pBuffer[m_iTop]; // } //} bool MyStack::pop(char &elem)//元素出栈,栈顶下降 { //先判定是否为空 if(stackEmpty()) { return false; } m_iTop--;//入栈之后栈顶指向的是一个空位置 elem = m_pBuffer[m_iTop]; return true; } void MyStack::stackTraverse(bool isFromButoom)//遍历栈中所有元素 { if(isFromButoom) { for(int i = 0; i < m_iTop;i++)//栈的长度就是m_iTop { cout<< m_pBuffer[i] << ","; } } else { for(int i = m_iTop-1; i>=0;i--) { cout << m_pBuffer[i] << ","; } } }
MyStack.h #ifndef INC_0131_MYSTACK_H #define INC_0131_MYSTACK_H class MyStack { public: MyStack(int size);//分配内存初始化栈空间,设定栈容量,栈顶 ~MyStack();//回收栈空间内存 bool stackEmpty();//判定栈是否为空,为空返回true,非空返回false bool stackFull(); void clearStack();//清空栈 int stackLength();//已有元素的个数 bool push(char elem);//元素入栈,栈顶上升 bool pop(char &elem);//元素出栈,栈顶下降 void stackTraverse(bool isFromButoom);//遍历栈中所有元素 private: char *m_pBuffer;//栈空间指针 int m_iSize;//栈容量 int m_iTop;//栈顶,栈中元素个数栈顶为1说明有一个元素 }; #endif //INC_0131_MYSTACK_H
为什么用.h和.cpp:https://blog.csdn.net/happywlg123/article/details/80375593
要想用 new,这个类要有一个默认的构造函数
函数指针 。
08:00
抛出异常 throw
外部 try catch
?????
(exception)异常,是用来报告你能恢复的那一类错误的,不是bugfix。
public class Coordinate { private int x; private int y; Coordinate(int x,int y){ this.x=x; this.y=y; } void PrintCoordinate(){ System.out.println("("+x+","+y+")"); } }
public class Mystackmain { public static void main(String[] args) { Mystack p=new Mystack(5); p.push('h'); p.push('e'); p.push('l'); p.push('l'); p.push('0'); p.StackTraverse(false); System.out.println(p.StackLength()); p.pop(); p.pop(); p.StackTraverse(false); System.out.println(p.StackLength()); if(p.isEmpty()){ System.out.println("栈为空"); } if(p.isFull()){ System.out.println("栈为满"); } p.DeleteMystack(); }
public class Mystack { private int head; private char[] stack; private int StackLength; private int StackCapacity; Mystack(int StackCapacity){ this.StackCapacity=StackCapacity; head=-1; StackLength=0; stack=new char[StackCapacity]; } void DeleteMystack(){ stack=null; } boolean isFull(){ if(head+1==StackCapacity){ return true; } return false; } boolean isEmpty(){ if(head==-1){ return true; } return false; } void ClearStack(){ head=-1; StackLength=0; } int StackLength(){ return StackLength; } boolean push(char k){ if(isFull()){ return false; } head++; stack[head]=k; StackLength++; return true; } boolean pop(){ if(isEmpty()){ return false; } System.out.println("出栈元素为"+stack[head]); head--; StackLength--; return true; } void StackTraverse(boolean isFromTop){ if(!isFromTop){ for(int i=0;i<=head;i++){ System.out.print(stack[i]); } System.out.println(); } else { for (int i = head; i >= 0; i--) { System.out.print(stack[i]); } System.out.println(); } }
java实现
栈类:后进先出
公有函数:
MyStack(int size):构造函数,分配内存空间
~MyStack() :析构函数与构造函数相反,主要在构造函数执行完毕后被自动调用执行善后工作,如释放构造函数开辟的内存
int stackLength(): 返回栈里面的元素个数(不是内存空间大小)
void push(char elem):入栈(入栈前要判断栈是否已满)
void pop(char &elem):出栈(出栈前要判断栈是否为空)
入栈导致栈顶上升 出栈导致栈顶下降
当成员变量比较复杂时要用到拷贝构造函数
LIFO: last in first out
后进先出
使用类模板时要在每个成员函数前加上template<typename T>,每个成员函数类名后加上<T>。 使用重载运算符重载<<:(库文件加上#include<ostream>)
定义类模板的模板函数T template<typename T> 用T来取代通用数据类型 使用类模板时要在每个成员函数前加上template<typename T>,每个成员函数类名后加上<T>。
特殊类型
#include<ostream>
using namespace std;
friend sotream &operator<<(ostream &out,类型名 &coor)//声明一个友元函数
实例的介绍
栈是一种先进后出的机制
栈类的声明
栈不能通过下标访问,需要重载
可以通过pop方法打印弹出的值
当打印的数是十六进制,会出现显示问题,所以我们自己建立索引列表