数据结构 实验四 栈的算法实现及应用

实验项目名称:栈的算法实现及应用

实验目的:熟悉栈的逻辑特性、存储表示方法和栈的基本操作。

实验要求:了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。

实验内容:

编写程序实现下列的要求:

(1)编写程序,用不同的存储方法(顺序栈+链栈),实现栈的基本操作。

/*顺序栈*/
#include <iostream>
using namespace std;

const  int  MAX_SIZE = 100;
//顺序栈
class  SeqStack {
public:
    SeqStack() {
        top = -1;   //构造函数,初始化一个空栈
    }
    ~SeqStack(){};  //析构函数为空
    void Push(int x); //入栈操作,将元素x入栈
    int Pop();    //出栈操作,将栈顶元素弹出
    int GetTop(); //取栈顶元素(并不删除)
    bool Empty() {
        return top == - 1 ? true : false;    //判断栈是否为空
    }
    void Print();  //遍历操作
private:
    int data[MAX_SIZE];//存放栈元素的数组
    int top;      //栈顶元素在数组的下标
};

//入栈
void SeqStack:: Push(int x) {
    if (top == MAX_SIZE - 1) throw  "上溢";
    top++;
    data[top] = x;
}

//出栈
int SeqStack:: Pop() {
    int x;
    if (top == -1) throw"下溢";
    x = data[top--];
    return  x;
}

//取栈顶元素(并不删除)
int SeqStack:: GetTop() {
    if(top != -1)
        return data[top];
}

//遍历
void SeqStack:: Print() {
    for( int i = 0 ; i <= top ; i++) {
        cout << data[i] << " ";
    }
    cout << endl;
}

int main( ) {
    cout << "请输入要定义的栈的元素个数:n=";
    int n ;  //定义栈的元素个数
    cin >> n; //输入n
    int a[n];
    int i, x;
    SeqStack z;

    cout << "请按顺序输入n个要推进栈的元素:" << endl;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i < n; i++) {
        z.Push(a[i]);
    }
    cout << "当前栈结果如下:(从左到右依次为栈底到栈顶)" << endl;
    z.Print();
    cout << "当前栈顶元素为:" << z.GetTop() << endl;
    cout << "栈顶元素"<< z.GetTop() << "出栈 " << " 结果如下:(从左到右依次为栈底到栈顶)" << endl;
    z.Pop();
    z.Print();
    cout << "当前栈顶元素为:" << z.GetTop() << endl;
    return 0;
}

/*链栈*/
#include <iostream>
using namespace std;

struct Node {
    int data;         //数据域
    Node *next;       //指针域
};

class LinkStack {
public:
    LinkStack();      //构造函数,初始化一个空栈
    ~LinkStack();     //析构函数,释放链栈各结点的存储空间
    void Push(int x); //入栈操作,将元素x入栈
    int Pop();        //出栈操作,将栈顶元素出栈
    int GetTop();     //取栈顶元素(并不删除)
    void Print();     //遍历操作
private:
    Node *top;        //栈顶指针即链栈的头指针
};

    //链栈的构造函数
LinkStack::LinkStack() {
    top = new Node ;      //生成头结点
    top = NULL;           //头结点的指针域置空
}

 //析构函数
LinkStack::~LinkStack() {
    Node *q = NULL;
    while(top != NULL) {  //释放链栈的每一个结点的存储空间
        q = top;          //暂存被释放结点
        top = top->next;  //top指向被释放结点的下一个结点
        delete q;
    }
}

//入栈操作
void LinkStack::Push(int x) {
    Node *s;
    s = new Node;
    s->data = x;        //申请结点s 数据域为x
    s->next = top;
    top = s;            //将结点s插在栈顶
}

//出栈操作
int LinkStack::Pop() {
    Node *p = NULL;
    int x;
    if(top == NULL) throw"下溢";
    x = top->data;
    p = top;            //暂存栈顶元素
    top = top->next;    //将栈顶结点摘链
    delete p;
    return x;
}

//取栈顶元素操作
int LinkStack:: GetTop() {
    if(top == NULL) throw"下溢异常";
    else return top->data;
}

//遍历操作
void LinkStack::Print() {
    Node *p = top;      //工作指针p初始化
    while(p != NULL) {
        cout << p->data << " ";
        p = p->next;    //工作指针p后移,注意不能写作p++
    }
    cout << endl;
}

int main( ) {
    cout << "请输入要定义的栈的元素个数:n=";
    int n ;     //定义栈的元素个数
    cin >> n;   //输入n
    int a[n];
    int i, x;
    LinkStack z;

    cout << "请按顺序输入n个要推进栈的元素:" << endl;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i < n; i++) {
        z.Push(a[i]);
    }
    cout << "当前栈结果如下:(从左到右依次为栈顶到栈底)" << endl;
    z.Print();
    cout << "当前栈顶元素为:" << z.GetTop() << endl;
    cout << "栈顶元素"<< z.GetTop() << "出栈 " << " 结果如下:(从左到右依次为栈顶到栈底)" << endl;
    z.Pop();
    z.Print();
    cout << "当前栈顶元素为:" << z.GetTop() << endl;
    return 0;
}

 (2) * 判断一个表达式中的括号(仅有一种括号,小、中或大括号)是否配对。编写并实现它的算法。

/*判断表达式中小括号是否匹配*/
#include <iostream>
#include <string>
using namespace std;

class Matcher {
public:
    Matcher(string str);
    ~Matcher() { };  /*析构函数为空*/
    int match();
private:
    string str;
};

Matcher :: Matcher(string str) {
    this->str = str;
}

int Matcher :: match() {
    string S;                         	/*定义一个字符对象 */
    int i, top = -1;                    /* top为字符对象S的尾指针 */
    for (i = 0; str[i] != '\0'; i++) {  /* 依次对str对象的每个字符, str[i]进行处理 */
        if (str[i] == ')') {            /*当前扫描的字符是右括号*/
            if (top > -1) top--;        /*出栈前判断栈是否为空*/
            else return -1;
        } else if (str[i] == '(')       /*当前扫描的字符是左括号*/
            S[++top] = str[i];          /*执行入栈操作*/
    }
    if (top == -1) return 0;            /*栈空则括号正确匹配*/
    else return 1;
}


int main( ) {
    string str;                /*定义尽可能大的字符数组以接收键盘的输入*/
    int k;                     /*k接收调用函数Match的结果*/
    cout << "请输入一个算术表达式:";
    cin >> str;                /*将表达式以字符串方式输入*/
    Matcher M(str);            /*定义对象变量M*/
    k = M.match();             /*函数调用,实参为字符数组的首地址*/
    if (k == 0) {
        cout << str;
        cout << "正确匹配" << endl;
    } else if (k == 1) {
        cout << "多左括号" << endl;
    } else {
        cout << "多右括号" << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见以前说再见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值