struct myStack{
public object []stackArray;
public int top;
}
class Program
{
static void Main(string[] args)
{
myStack st1;
string strName;
initStack(out st1);
Console.WriteLine("请输入一个想要反序的字符串");
strName = Console.ReadLine();
for (int i = 0; i < strName.Length; i++)
{
pushStack(ref st1, strName[i]);
}
Console.WriteLine("反序后的结果为:");
while (st1.top != 0)
{
Console.Write((char)popStack(ref st1));
}
Console.Write("\n");
}
static void initStack(out myStack st)
{//初始化堆栈,分配内存
st = new myStack();
st.stackArray = new object[64];
}
static void pushStack(ref myStack st, object e)
{//将任意类型的元素压入栈
if (st.top == st.stackArray.Length)
{
Console.WriteLine("栈空间已满");
return;
}
st.stackArray[++st.top] = e;
}
static object readStackTop(myStack st){//读取栈顶元素
object e=new object();
e = st.stackArray[st.top];
return e;
}
static object popStack(ref myStack st)
{//弹出一个栈内元素
object e = new object();
if (st.top == 0)
{
Console.WriteLine("栈元素已清空");
return "";
}
e = st.stackArray[st.top--];
return e;
}
这里用结构体和数组做了一个简单的栈结构,其实还有另外一种栈结构叫做链栈,如果大家昨天看过我链表的帖子,可以回忆一下链表的操作方法有哪些,链栈就是仅限于插入头节点,删除头节点两种操作的链表
栈在计算机中的应用极为广泛,由于其先进后出的特性,普遍用于暂存函数的参数和局部变量,也用于CPU在进程切换时保存现场和恢复现场,栈的操作一般只有两种:进栈(也可以说成压栈,因为先进栈的会被压在底部),即把栈指针加1,然后把一个变量放进栈中,出栈,读取一个变量,然后把栈指针减1,当栈指针为0时,即为空栈。
本例中使用了object类型,我们知道,object类型的参数可以接受任何类型,所以有比较好的通用性
给字符串反序仅仅是栈的一种简单用法,下一贴,我会写一个稍微复杂一点的应用给大家,感谢亲们的支持 |