数据结构上机二:栈和队列的应用

上机二:栈和队列的应用

内容要点

(1)利用栈进行十进制数与N进制(如二进制、八进制、十六进制)数据之间的转换;
(2)利用数组q[m]存储循环队列,该队列只有一个队列头指针front,不设队列尾指针,而设一个计数器count,用以记录队列中元素个数。实现循环队列的判空、入队和出队操作。

源码(1)

利用栈进行十进制数与N进制(如二进制、八进制、十六进制)数据之间的转换

#include<iostream>//栈和队列的应用:链栈进制转换十->n
using namespace std;
typedef class snode
{
public:
	int data;
	class snode *next;
};
class linkstack
{
public:
	snode *top;
    void initstack()//构造空栈
	{
		top=NULL;
    }
    void push(int x)//元素x入栈
    {
		snode *p;
		p=new snode;
		p->data=x;
		p->next=top;
		top=p;
      }
	int pop(int &x)//出栈,同时用x保存栈顶元素值
	{
		snode *p;
		if(top==NULL)
			return 0;
		x=top->data;
		p=top;
		top=top->next;
		delete p;
		return 1;
	}
	int gettop()//返回栈顶元素,不修改栈顶指针
	{	
		if(top!=NULL)
				return top->data;
		else	
			return -1;
	}
    void out()
    {
		int x;//可以暂存栈顶元素
		while(top!=NULL)
		{
			cout<<gettop();
			pop(x);//出栈
		}
		cout<<endl;
      }
	void transform()
	{
		int num,r,k;
		cout<<"输入要转换的数字,进制:";
		cin>>num>>r;
		cout<<endl;
		while(num!=0)
		{
			k=num%r;
			push(k);
			num=num/r;
		}
	}
};
int main()
{
	int n,x;
	linkstack m;
	m.initstack();//初始化链栈
	m.transform();//进制转换
	m.out();
}

源码(2)

利用数组q[m]存储循环队列,该队列只有一个队列头指针front,不设队列尾指针,而设一个计数器count,用以记录队列中元素个数。实现循环队列的判空、入队和出队操作。

#include<iostream>
using namespace std;
template <class T>
class hhh
{
private:
	int maxsize,front,count;
	T *a;//T类型的数组,a为数组名
public:
	hhh(int size)//构造函数,初始化
	{
		maxsize=size;
		front=count=0;
		a=new T[maxsize];//t类型
	}
	~hhh()
	{
		if(a)
		{
			delete []a;//释放申请的内存空间
			a=NULL;//释放a指针
		}
	}
	void empty()//判空
	{
		if(count==0)
		{
			cout<<"循环队列为空"<<endl;
		}
		else
		{
			cout<<"队列中存在元素"<<endl;
		}
	}
	void in(T x)
	{
		int r;
		if(maxsize==count)
		{
			cout<<"循环队列上溢"<<endl;
		}
		else
		{
			count++;
			r=(front+count)%maxsize;
			a[r]=x;
		}
	}
	void out(int x)
	{
		if(count==0)
		{
			cout<<"循环队列下溢"<<endl;
		}
		else
		{
			front=(front+1)%maxsize;
			x=a[front];
			cout<<"本次出栈元素为:"<<x<<endl;
			count--;//出栈
		}
	}
	void show()//输出队列中所有元素
	{
		if(count==0)
			cout<<"队列为空"<<endl;
		else
		{
			cout<<"全部元素:";
		    int num=count,f=front;
			while(num>0)
			{
				f=(f+1)%maxsize;
				cout<<a[f]<<' ';
				num--;
			}
			cout<<endl;
		}	
	}
};
int main()
{
	int num,x,a;
	cout<<"输入队列最大容量:";cin>>num;
	hhh<int> A(num);
	cout<<endl;
	cout<<"操作选择:1--判空,2--入队,3--出队,4--查看队中元素,0--退出"<<endl;
	while(cin>>x&&x)
	{
		switch(x)
		{
		case 1:A.empty();break;
		case 2:
			cout<<"输入入队元素";cin>>a;
			A.in(a);
			break;
		case 3:
			int m;
			A.out(m);
			break;
		case 4:
			A.show();
			break;
		}
	}
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纸梯先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值